2

重複の可能性:
乱数ジェネレーターが計画どおりに機能しない(C#)

9桁の文字列番号を返すメソッドがあります。このメソッドを呼び出すと、期待どおりに正しく機能しますが、loopステートメントで呼び出すと、1つの数値しか生成されず、繰り返されるため、正しく機能しません。

コードは次のとおりです。

private string GenerateRandomNumber()
        {
            Random r = new Random();
            return r.Next(111111111, 999999999).ToString();
        }
        protected void btnSolo_Click(object sender, EventArgs e)
        {
            Response.Write(GenerateRandomNumber());
            // Every time I call this method , it return 9 digit random number wich is different with the previous call like : 146956595  
        }
        protected void btnBulk_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < 100; i++)
            {
                string randomNumber = GenerateRandomNumber();
                Response.Write("<br /> " + randomNumber);
                //It  create just one 9 digit number 100 times !
            }
        }
4

2 に答える 2

3

クラスRandom r = new Random();レベルで実行し、rクラス変数として保存します。の後続の呼び出しはNext、同じ「ランダム」値を生成しません。

private static Random r = new Random();

private string GenerateRandomNumber()
{
    return r.Next(111111111, 999999999).ToString();
}

protected void btnSolo_Click(object sender, EventArgs e)
{
    Response.Write(GenerateRandomNumber());
}

protected void btnBulk_Click(object sender, EventArgs e)
{
    for (int i = 0; i < 100; i++)
    {
        string randomNumber = GenerateRandomNumber();
        Response.Write("<br /> " + randomNumber);
    }
}
于 2012-08-09T19:28:39.667 に答える
2

GenerateRandomNumber()メソッドは、システムクロックをシードとして使用します。

つまり、コンピュータでは真のランダム性は不可能であるため、システムクロックの現在の値に対して複雑な計算を実行します。重要なのは、CPUが非常に高速であるため、時間がほとんど変更されていないため(あるとしても)、ループを実行して同じ値を取得している可能性があるということです。さらに繰り返しループしてみて、何が起こるかを確認してください。最終的にはランダムな値が変わるはずです。

于 2012-08-09T19:27:15.220 に答える