【发布时间】:2016-06-12 14:52:39
【问题描述】:
考虑以下程序:
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不是线程安全的。 -
@roryap 正常的 for 循环不会发生这种情况。至少在我的机器上。
-
Random类不是线程安全的。您不应该在没有同步的情况下在多个线程中使用它。如果你这样做了,你应该期待一些奇怪的事情。 -
@MatiasCicero -- 好的。您可能想在您的问题中澄清这一点。
标签: c# .net random parallel-processing