-1
public string Weird
{
    get
    {
        int length = 10;
        Random random = new Random();
        string chars = "123456789abcdefghijklmnpqrstuvwxyzABCDEFGHIJKLMNPQRSTUVWXZ";
        StringBuilder builder = new StringBuilder(length);

        for (int i = 0; i < length; i++)
        {
            builder.Append(chars[random.Next(chars.Length)]);
        }

        return builder.ToString();
    }
}

Response.Write(Weird);
Response.Write("<br />");
Response.Write(Weird);
Response.Write("<br />");
Response.Write(Weird);

Result : 

9eFZ5XrJxZ
9eFZ5XrJxZ
9eFZ5XrJxZ

呼び出しごとに結果が異なると思っていましたが、同じ結果値が返されます。どうしてですか?変数が割り当てられると、get メソッドは再度実行されませんか?

4

3 に答える 3

4

http://msdn.microsoft.com/en-us/library/system.random.aspxから:

乱数の生成はシード値から始まります。同じシードを繰り返し使用すると、同じ一連の数値が生成されます。異なるシーケンスを生成する 1 つの方法は、シード値を時間依存にすることです。これにより、Random の新しいインスタンスごとに異なるシリーズが生成されます。

既定では、Random クラスのパラメーターなしのコンストラクターはシステム クロックを使用してシード値を生成しますが、パラメーター化されたコンストラクターは現在の時間の目盛り数に基づいて Int32 値を取ることができます。ただし、クロックの分解能は有限であるため、パラメーターなしのコンストラクターを使用して異なる Random オブジェクトを連続して作成すると、同一の乱数シーケンスを生成する乱数ジェネレーターが作成されます。

于 2013-07-18T20:18:14.403 に答える
0

呼び出し間で Random オブジェクトを永続化できない場合は、呼び出すたびに擬似乱数値をシードする必要があります。

于 2013-07-18T20:18:33.120 に答える
-2

Dilbert は 2001 年に同じ問題に遭遇しました。

http://dilbert.com/strips/comic/2001-10-25/

一致?

私はそうは思わない。

そして、random.org は同意します: http://www.random.org/analysis/

于 2013-10-15T21:04:40.157 に答える