說明: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多線程