C#随机不改变
我已经在寻找这个问题,但我发现的解决方案没有一个有用。也许有人能帮我 我有以下循环:C#随机不改变,c#,.net,random,parallel-processing,C#,.net,Random,Parallel Processing,我已经在寻找这个问题,但我发现的解决方案没有一个有用。也许有人能帮我 我有以下循环: 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)
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);
}
整个循环位于另一个循环中,该循环同样位于并行.Foreach
-循环中。
似乎j
总是0
。大多数情况下,它并不明显,但如果数组[0]==0
,则它不会退出循环。
我怀疑do-while
-循环可能太快了。但几秒钟后(~30)它也不会离开循环。因此,Random
似乎不会返回新的或不同的值(即使在同一线程中)
我也试过了,但没有效果。随机不是线程安全的,对于并行操作来说,随机性不够。考虑使用一个线程安全的RNG,但是知道它比随机的慢一些,因为生成数字的算法要复杂得多。 < P>尝试这个,因为随机不是线程安全的:
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);
}
谢谢你的快速回答。 已经给了我所需要的。
我曾经
为了我的解决方案。它工作得很好,速度也很快。
System.Random
不是线程安全的。请参阅遗漏的内容——简短、完整的示例,我们可以不做任何修改就复制、粘贴和运行,这总是很好的。Jon Skeet说得最好,和往常一样:_randomLock是多余的:只需锁定静态只读随机实例。@DavidH这是真的,但出于教育目的,最好先锁定一个空的对象
,这样概念就清楚了,然后再解释,实际上,您可以锁定范围内的任何静态对象,而不仅仅是对象
。我100%同意,因此没有否决权。:)一定有什么遗漏了,因为就目前情况而言,即使从多个线程访问,代码也会产生随机数。您是否已中断/调试以查看j
是否实际从RANDOM接收到值。下一步(8)
?也许可以尝试一下随机的程序暂停时在即时窗口中的代码>吗?等等,我错过了这个。。。为什么将其标记为“只读”?这可能就是它不起作用的原因,删除它并使其成为静态。OP,这与我最初问您的问题相同,即您是否正确锁定了共享/静态随机实例。你说你是。这不可能是真的,因为这段代码显然做了同样的事情…似乎不是这样,因为当我尝试另一个建议时,它不起作用。这不值得争论,但我很高兴最终你得到了一个有效的解决方案!
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();
}
}