9

アプリケーション全体で固定シードを使用してインスタンス化されるSystem.Randomオブジェクトを使用しています。NextDoubleメソッドを呼び出していますが、しばらくすると0.0になります。

これに対する救済策はありますか、他の誰かがこれに遭遇しましたか?

編集:便宜上、実行全体で1つのシードを1000に設定しています。random.NextDoubleは数十万回呼び出されます。これはオプティマイザーアプリケーションであり、数時間実行できますが、これは実際には10〜0分の実行後に発生します。最近、アプリにランダムな呼び出しをもう少し追加しました。

4

5 に答える 5

18

.NET の乱数ジェネレーターはスレッド セーフではありません。他の開発者も同じ動作に気付いており、1 つの解決策は次のとおりです (からhttp://blogs.msdn.com/brada/archive/2003/08/14/50226.aspx ):

class ThreadSafeRandom
{
    private static Random random = new Random();

    public static int Next()
    {
       lock (random)
       {
           return random.Next();
       }
    }
}
于 2008-11-17T15:55:44.743 に答える
9

どのくらいの頻度でランダムにシードしますか?プログラムの開始時に1回だけ実行する必要があります。

また、特定の値をシードすると、常にまったく同じシーケンスが生成されます。

于 2008-11-17T15:42:01.573 に答える
3

他の人々はすでにそれを説明し、解決策を提供するまともな仕事をしています。

とにかく、同様の質問が以前にエリックによって答えられました、それをチェックしてください:

同じ出力の疑似ランダムジェネレータ

また、トピック(乱数ジェネレーター)に関連する質問と回答は次の場所にあります。

Stackoverflow.com乱数ジェネレーター

遺伝子

PSこれは受け入れられた答えを補足するためだけのものです。

于 2008-11-17T16:07:46.250 に答える
3

Tomas、私は以前にこの「バグ」に遭遇しましたが、解決策は _rnd 変数をモジュールレベルにすることでした:

Private Shared _rnd As System.Random()
Public Shared Function RandRange(ByVal low As Integer, ByVal high As Integer) As Integer
    If _rnd Is Nothing Then
        _rnd = New System.Random()
    End If
    Return rnd.Next(low, high)
End Function
于 2008-11-17T15:56:16.833 に答える
1

このhttp://msdn.microsoft.com/en-us/library/system.random.aspxを見て、同じ値を取得する理由を説明する必要があります。

于 2008-11-17T15:45:02.690 に答える