为什么Random.Next()总是返回相同的数字

kd7*_*kd7 18 c# random clr

考虑这种方法:

private static int GenerateRandomNumber(int seed, int max)
{
   return new Random(seed).Next(max);
}
Run Code Online (Sandbox Code Playgroud)

在我的机器上,执行此循环会产生相同数量的1500次迭代:

  for (int i = 0; i < 1501; i++)
            {
                int random = GenerateRandomNumber(100000000, 999999999);
                Console.WriteLine(random.ToString());
                Console.ReadKey();
            }
Run Code Online (Sandbox Code Playgroud)

每次迭代我得到145156561.

我没有一个紧迫的问题,我只是好奇这个问题的原因.接下来(最大值)说:"返回一个非负随机比指定的最大数量较少,也许我不理解一些基本的东西.

Ree*_*sey 40

你总是使用相同的种子播种一个新实例,然后抓住第一个最大值.通过使用种子,您可以保证相同的结果.

如果你想要一个产生不同结果的静态随机数生成,你应该重做一下.但是,由于Random不是线程安全的,因此静态使用时需要一些同步.就像是:

private static Random random;
private static object syncObj = new object();
private static void InitRandomNumber(int seed)
{
     random = new Random(seed);
}
private static int GenerateRandomNumber(int max)
{
     lock(syncObj)
     {
         if (random == null)
             random = new Random(); // Or exception...
         return random.Next(max);
     }
}
Run Code Online (Sandbox Code Playgroud)

  • 作为免费奖金,我将在随机和ThreadLocal上添加Jon Skeet的文章!:-) http://csharpindepth.com/Articles/Chapter12/Random.aspx (3认同)
  • 如果您需要许多随机数,这可能会杀死 PC :-) 如果您在 C# 4.0 下,至少使用 SpinLock,或者使 Random 对象 Thread Static。 (2认同)

dbr*_*rin 7

迪尔伯特在2001年遇到了同样的问题:

http://dilbert.com/strips/comic/2001-10-25/

巧合?

我不这么认为.

random.org同意:http://www.random.org/analysis/

  • SO中没有幽默空间,真的吗? (5认同)

Eri*_*ere 6

问题是您每次都使用相同的种子编号创建一个新的Random实例.您应该创建一个Random实例(如果需要,将其存储在静态中)并简单地在同一实例上调用next方法.

随机数生成并非真正随机,有关详细信息,请参阅此维基百科条目.