Random 并行生成数字 1 的次数超过 90% [重复]

2024-05-02

考虑以下程序:

public class Program
{
     private static Random _rnd = new Random();
     private static readonly int ITERATIONS = 5000000;
     private static readonly int RANDOM_MAX = 101;

     public static void Main(string[] args)
     {
          ConcurrentDictionary<int,int> dic = new ConcurrentDictionary<int,int>();

          Parallel.For(0, ITERATIONS, _ => dic.AddOrUpdate(_rnd.Next(1, RANDOM_MAX), 1, (k, v) => v + 1));

          foreach(var kv in dic)
             Console.WriteLine("{0} -> {1:0.00}%", kv.Key, ((double)kv.Value / ITERATIONS) * 100);
     }
}

这将打印以下输出:

(请注意,每次执行的输出都会有所不同)

> 1 -> 97,38%
> 2 -> 0,03%
> 3 -> 0,03%
> 4 -> 0,03%
...
> 99 -> 0,03%
> 100 -> 0,03%

为什么数字1产生的频率如此之高?


Random is not线程安全。

Next没有做任何特别的事情来确保线程安全。

不要使用Random像这样。并且也不要考虑使用线程本地存储持续时间,否则你会弄乱生成器的统计属性:must只使用一个Random实例。一种方法是使用lock(_global)并在该锁定区域绘制一个数字。

I think这里发生的情况是,第一个到达生成器的线程正确生成了随机数,并且所有后续线程每次绘图都收到 0。使用 32 个线程的“并行化”线程池,大约可以达到您上面引用的比率;假设 31 个线程的结果放置在第一个存储桶中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Random 并行生成数字 1 的次数超过 90% [重复] 的相关文章

随机推荐