C#中Random

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

相關文章
相關標籤/搜索