Fork me on GitHub

说明: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

posted on 2019-05-29 22:40  lingfeng95  阅读(800)  评论(0编辑  收藏  举报