代码之家  ›  专栏  ›  技术社区  ›  jlee

生成长度为10000个字符的随机数字字符串的算法?

  •  1
  • jlee  · 技术社区  · 14 年前

    可以是任何语言,甚至是伪代码。我是在一个面试问题中被问到这个问题的,我很好奇你们能想出什么办法。

    8 回复  |  直到 14 年前
        1
  •  3
  •   Matthew Slattery    14 年前

    我认为这是一个技巧性的问题-使用标准库例程生成数字的明显答案几乎肯定是有缺陷的,如果你想以相同的概率生成每一个可能的10000位数字。。。

    如果算法随机数生成器保持 n个 很明显,它可以产生 最多 n个 可能有不同的输出序列,因为只有2个 n个 不同的初始配置。

    三万三千二百一十九 <10分 一万 <2号 三万三千二百二十 ,所以如果你的算法使用的内部状态少于33220位 不可能 生成10个 一万 可能是10000位(十进制)数字。

    典型的标准库随机数生成器不会使用这样的内部状态。甚至 Mersenne Twister (我所知道的最常提到的具有大状态的生成器)只保留624个32位字(=19968位)的状态。

        2
  •  1
  •   Mitch Wheat    14 年前

    只是众多方法中的一种。您可以传入要使用的任何字符字符串:

    public class RandomUtils
    {
        private static readonly Random random = new Random((int)DateTime.Now.Ticks);
    
        public static string GenerateRandomDigitString(int length)
        {
            const string digits = "1234567890";
    
            return GenerateRandomString(length, digits);
        }
    
        public static string GenerateRandomAlphaString(int length)
        {
            const string alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
    
            return GenerateRandomString(length, alpha);
        }
    
    
        public static string GenerateRandomString(int length, string alphabet)
        {
            int maxlen = alphabet.Length;
    
            StringBuilder sb = new StringBuilder();
    
            for (int i = 0; i < length; i++)
            {
                sb.Append(alphabet[random.Next(0, maxlen)]);
            }
    
            return sb.ToString();
        }
    }
    
        3
  •  1
  •   Pat O    14 年前

    无需额外要求,这将起作用:

    StringBuilder randomStr = new StringBuilder(10000);
    Random rnd = new Random();
    for(int i = 0; i<10000;i++)
    {
      char randomChar = rnd.AsChar();
      randomStr[i] = randomChar;
    }
    

    这将导致无法打印字符和其他不愉快。使用一个ASCII编码器,你可以得到字母,数字和穿孔坚持范围32-126。或者创建一个介于0和94之间的随机数并加上32。不确定他们在这个问题中寻找的是哪一方面。

    顺便说一句,不,我不知道头顶的可视范围,我在维基百科上查过了。

        4
  •  0
  •   Jerry Coffin    14 年前

    生成0..9范围内的数字。把它转换成一个数字。把它串起来。重复10000次。

        5
  •  0
  •   whatnick    14 年前

    我总是喜欢说计算机随机数总是只是伪随机的。无论如何,你最喜欢的语言总是有一个随机库。接下来什么是数字字符串?每个字符值为0-9?好吧,让我们从这个假设开始。因此,我们可以生成0-9之间的字节,偏移量(48)和(int)随机*10(因为随机生成器通常返回浮点)。然后将它们全部放入一个10000长的字符缓冲区并转换为字符串。

        6
  •  0
  •   High Performance Mark    14 年前

    返回包含10000的字符串 1 这和其他任何长度相同的数字字符串一样随机。

        7
  •  0
  •   MSN    14 年前

    我想真正的问题是确定面试官到底想要什么。例如,什么意义上的随机性?不可压缩?在同一算法的多次运行上随机?等。

        8
  •  0
  •   mattbasta    14 年前

    您可以从种子数字列表开始:

    seeds = [4,9,3,1,2,5,5,4,4,8,4,3] # This should be relatively large
    

    然后,使用计数器跟踪最后使用的数字。这将是系统范围的,不应使用系统重置:

    def next_digit():
        counter = 0
        while True:
            yield counter
            counter += 1
    pos_it = next_digit()
    rand_it = next_digit()
    

    接下来,使用一个使用模数来确定“下一个数”的算法:

    def random_digit():
        position = pos_it.next() % len(seeds)
        digit = seeds[position] * rand_it.next()
        return digit % 10
    

    最后,生成10000个这样的数字。

    output = ""
    for i in range(10000):
        output = "%s%s" % (output, random_digit())
    

    我相信一个理想的答案会使用更多的质数,但这应该已经足够了。