3

すでにこの質問を検索しましたが、見つけた解決策はどれも役に立ちませんでした。多分誰かが私を助けることができます。

次のループがあります。

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-loop が速すぎるのではないかと疑いました。しかし、数秒後 (~30) もループを離れません。そのためRandom、同じスレッドであっても、新しい値または異なる値を返していないようです。

私もこの解決策を試しましたが、効果はありませんでした。

4

3 に答える 3

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);
}
于 2013-05-31T20:28:58.180 に答える
2

素早い回答ありがとうございます。 マシューの答えは、私が必要としていたものをすでに与えてくれました。
使った

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

私の解決策のために。それは非常にうまく機能し、非常に高速です。

于 2013-05-31T20:44:08.917 に答える
1

ランダムはスレッドセーフではなく、並列操作に対して十分にランダムではありません。RNGCryptoServiceProviderなどのスレッド セーフな RNG の使用を検討してください。

于 2013-05-31T20:28:31.700 に答える