プロが教える店舗&オフィスのセキュリティ対策術

いつもありがとうございます。

2種類のランダム文字列を作りたいのですが、
なぜか同じ文字列が作成されるという現象が起こります。

以下の関数を用意して
public static string ランダム(int 桁数)
{
string[] codelist = new string[] { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z" };

Random Random = new System.Random();

for (int i = 0; i < 桁数; i++)
{
randomcode += codelist[Random.Next(0, 36)];
}

return randomcode;

}

textBox1.Text = ランダム(10);
textBox2.Text = ランダム(10);

とやっても、同じランダムの文字列が入ってしまいます。

間に、
Thread.Sleep(100);

とか入れると変わるのですが・・・
理由がわかりません。

初心者的質問ですみませんがよろしくお願いします。

A 回答 (2件)

コンピュータで使われている乱数は、実際には「疑似乱数」と言って、一見バラバラで乱数と言ってもいい性質を持っていますが、実際には計算によって求められたものです。



それまでの値に、なんらかの計算をした結果を、「次の乱数」として使います。(Nextというメソッド名もそこに由来)
このとき、一番最初の状態になるものを「種(シード,seed)」と言います。
「前の状態から新しい乱数を計算する」ということから「種が同じなら、乱数列も同じになる」という性質があります。

バラバラにするための常套手段として、種に現在時刻から求めた値を使うことで、実行時刻が変化すれば値が変わるようにする、というのがあります。ただ、無限に細かい時刻をそのままコンピュータでは扱えないので、適当な単位(例えば、秒単位)になってしまい、単位時間以内(例えば、秒単位なら1秒以内)なら、同じ乱数列になってしまう、という問題があります。

Random.Random()のマニュアルを読むと
http://msdn.microsoft.com/ja-jp/library/h343ddh9 …
「既定のシード値はシステム時計から取得されるため、その分解能は有限です。 その結果、既定のコンストラクターを呼び出すことによって連続で作成される、異なる Random オブジェクトの既定のシード値は同一であるため、同一の乱数セットが生成されます。」
と、明記されています。

public static string ランダム(int 桁数) を2回呼び出していますが、その度に、Random Random = new System.Random();で新しい System.Randomオブジェクトを生成しています。
間にいくつかの処理が入っているとは言え、非常に短時間で終わるものなので、この「連続で作成される、異なる Random オブジェクト」となっている、と考えてよいでしょう。

対処法は、マニュアルにも書いてあります
    • good
    • 0

http://msdn.microsoft.com/ja-jp/library/system.r …

コンストラクターのRandom()の説明と、解説をよく読んでみてください。

それに起きてる現象を組み合わせて考えれば、原因はわかるかと思います。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!