1

重複の可能性:
1 つの乱数のみを生成する乱数ジェネレーター

私の作品には、次のように一連の単語からランダムに選択して文を生成する方法があります。

private string generateTest(string test)
{
    test = test.ToLower();
    string sentence = "";
    for (int c = 0; c < 30; c++)
    {
        Random r = new Random();
        int len = r.Next(3, 7);
        string word = "";
        for (int i = 0; i < len; i++)
        {
            word += test[r.Next(0, test.Length)];
        }
        sentence += word + ' ';
    }
    return sentence;
}

ただし、問題は、最初の 6 単語がランダムに生成された後、後続のすべての世代がまったく同じものになることです。例えば

aqaaaz、qqzaq、aqqza、azqq、aazzq、aqqa、azzzq、azzzq、azzzq、azzzq、azzzq、azzzq、azzzq、azzzq、azzzq、azzzq、azzzq、azzzq、azzzq、azzzq、azzzq、azzzq、azzzq、azzzq、azzzq。 ...

その後、プログラムを再起動しても同じことが当てはまります。これは、自動最適化を行っている .NET ランタイムであると考えています。誰かがよりよく説明できますか?この問題を回避するにはどうすればよいですか?

4

1 に答える 1

5

ループのサイクルごとにインスタンスを生成しています。コードを次のように変更します。

Random r = new Random();
for (int c = 0; c < 30; c++)
{
...

また、意味のあるシードを割り当てることもできます。現在、コンストラクターに何も渡していないため、同じインスタンスを再作成すると、実際にはランダムではない結果が生じる可能性があります。

編集:Shadow Wizardが正しく指摘したように、同じシードを与えると同じ結果が得られます。「意味のあるシード」と言ったとき、ランダムまたは疑似ランダムな属性を持つものを意味していました。より予測不可能な結果を​​生成する方法はたくさんありますが、問題を解決するには、インスタンスをサイクルから移動するか、インスタンスを含むクラスのメンバーとしてインスタンス化するだけで十分です。シードまたは RNG の選択は、要件によって異なります。

于 2013-01-14T15:01:00.213 に答える