说明:C#中的随机数是一个伪随机数,随机数字从一组有限的数字选择以相同的概率,所选的数字不是完全随机的,因为使用数学算法来选择它们。在大多数Windows系统中,Random的15毫秒内创建的对象很可能会有相同的种子值,Random类不是线程安全,若要避免此问题,请创建一个Random对象而不是多个对象,可以把这个random对象写成静态的。
例子
``` C# 多个new对象 List<Task> tasks = new List<Task>(); for (int i = 0; i < 10; i++) { var t = Task.Run(() => { var a = new Random(); Console.WriteLine(a.Next()); }); tasks.Add(t); } Task.WaitAll(tasks.ToArray()); //结果 //1522489488 //145533769 //1941645525 //1941645525 //1941645525 //1941645525 //1941645525 //1941645525 //1941645525 //1941645525 ``` ``` C# 一个对象 var a = new Random(); List<Task> tasks = new List<Task>(); for (int i = 0; i < 10; i++) { var t = Task.Run(() => { Console.WriteLine(a.Next()); }); tasks.Add(t); } Task.WaitAll(tasks.ToArray()); //结果 //2096161011 //1984131754 //349870744 //1887940592 //2036172948 //583109263 //603018983 //907326994 //25452174 //901934441 ```
结论
当有多线程访问的时候,不要在线程中使用new对象,或者写成static
微软Random源码地址
https://referencesource.microsoft.com/#mscorlib/system/random.cs,dec894a7e816e665