考虑以下程序:
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(使用前将#替换为@)