可以是任何语言甚至是伪代码。我在面试问题中被问到这个问题,很奇怪你们可以提出什么。
答案 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?在同一算法的多次运行中随机?等