说明: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安全
https://referencesource.microsoft.com/#mscorlib/system/random.cs,dec894a7e816e665多线程