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多线程

相关文章
相关标签/搜索