Random.Next()有时会在不同的线程中返回相同的数字

dan*_*n78 10 c# random multithreading

我有以下课程

class Program
{
   static Random _Random = new Random();

   static void Main(string[] args)
   {
      ...
      for (int i = 0; i < no_threads; ++i)
      {
         var thread = new Thread(new ThreadStart(Send));
         thread.Start();
      }
      ...   
   }

   static void Send()
   {
      ...
      int device_id = _Random.Next(999999);
      ...
   }
}
Run Code Online (Sandbox Code Playgroud)

代码创建指定数量的线程,启动每个线程,并随机分配每个线程device_id.出于某种原因,创建的前两个线程通常具有相同的线程device_id.我无法弄清楚为什么会这样.

Jon*_*eet 27

Random不是线程安全的 - 您不应该使用多个线程中的相同实例.它可能比返回相同的数据更糟糕 - 通过从多个线程使用它,你可以让它"卡住"在一直返回0,IIRC的状态.

显然,你不只是想在几乎同一时间为每个线程创建一个新实例,因为它们最终会得到相同的种子......

我有一篇文章详细介绍了这一点,并提供了一个实现,它Random使用递增种子懒惰地实例化每个线程的一个实例.


Dar*_*rov 5

Random是一个伪随机数生成器,并没有什么能阻止它为多个调用返回相同的结果.毕竟,这种情况发生的可能性很大.更不用说根据文档:

任何实例成员都不保证是线程安全的.

所以你不应该从多个线程中调用Next方法.