Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#随机不改变_C#_.net_Random_Parallel Processing - Fatal编程技术网

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(); 
    } 
}