用于生成随机数字字符串的算法,长度为10,000个字符?

时间:2010-11-19 00:12:44

标签: algorithm string big-o

可以是任何语言甚至是伪代码。我在面试问题中被问到这个问题,很奇怪你们可以提出什么。

8 个答案:

答案 0 :(得分:3)

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

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

2 33219 &lt; 10 10000 &lt; 2 33220 ,所以如果你的算法使用少于33220位的内部状态,它不可能生成10个sup <10000> 可能的10000位数中的一些(十进制)数字。

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

答案 1 :(得分:1)

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

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();
    }
}

答案 2 :(得分:1)

如果没有其他要求,这将有效:

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.不确定他们在问题中寻找哪个方面。

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

答案 3 :(得分:0)

生成0..9范围内的数字。将其转换为数字。把它塞进一根绳子里。重复10000次。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

返回一个包含10,000 1 s的字符串 - 与任何其他长度相同的数字字符串一样随机。

答案 6 :(得分:0)

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

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

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

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

我认为一个理想的答案会使用更多素数,但这应该足够了。

答案 7 :(得分:0)

我认为真正的问题是要确定面试官真正想要的是什么。例如,在什么意义上随机? Uncompressable?在同一算法的多次运行中随机?等