我已经搜索过这个问题,但我找到的解决方案都没有帮助。也许有人可以帮助我。
我有以下循环:
private static readonly Random RANDOM = new Random();
...
int[] array; // is initialized, when used. ;)
if (array.Sum() != 0)
{
int j = 0;
do {
j = RANDOM.Next(8);
} while (array[j] == 0);
}
这整个循环位于另一个循环中,同样位于Parallel.Foreach
循环中。
似乎j
总是0
。大多数情况下它并不明显,但如果array[0] == 0
,那么它就不会退出循环。
我怀疑do-while
- 循环可能是快速的。但也经过几秒钟(~30),它不会离开循环。所以Random
似乎没有返回一个新的或不同的值(即使在同一个线程中)。
我也试过this solution但没有效果。
答案 0 :(得分:3)
请尝试这样做,因为Random不是线程安全的:
private static Random RANDOM = new Random();
private static object _randomLock = new object();
...
int[] array; // is initialized, when used. ;)
if (array.Sum() != 0)
{
int j = 0;
do {
lock(_randomLock)
{
j = RANDOM.Next(8);
}
} while (array[j] == 0);
}
答案 1 :(得分:2)
感谢您的快速解答。 Matthew's answer已经把我需要的东西给了我 我用了
public static class RandomGen2
{
private static Random _global = new Random();
[ThreadStatic]
private static Random _local;
public static int Next()
{
Random inst = _local;
if (inst == null)
{
int seed;
lock (_global) seed = _global.Next();
_local = inst = new Random(seed);
}
return inst.Next();
}
}
我的解决方案。它工作得很好而且非常快。
答案 2 :(得分:1)
Random不是线程安全的,并且对于并行操作来说不够随机。考虑使用线程安全的RNG,例如RNGCryptoServiceProvider,但要知道它会比Random慢一点,因为生成数字的算法要复杂得多。