|
■No50473 (カルメン さん) に返信 > これを1つの関数として組み込んでいますが、(2)の方法だと > 10回ループしたとして、10回全て同じ日付が返ってきます。
(1)も(2)も提示のコードは、考え方はまったく同じなので、 ループの中に上記の処理を組み込んだ場合、(1)(2)のどちらの場合も不都合な結果になる可能性はあります。 (VB固有のRandomize、Rndは内部的にSystem.Randomを使っていないようなので動作結果は違うのかもしれませんが)
> 重複させないようにするにはどうしたらよいのでしょうか?
こちらについては中さんのご指摘の通りですが、もう少し補足しておきます。
乱数を扱う機能は、
1. どんな乱数列を使うかを決定する →例えば、3187, 28912, 2 , 10 2093, ・・・ というような乱数列に決まったとする 2. 最初に決めた乱数列から乱数を取り出す →1回目は3187 3. 2.を繰り返す →2回目は28912 3回目は2 4回目は...
というような処理手順を踏んで使用します。
1.の部分に当たるのが、(1)ならRandomizeステートメント、(2)ならNew Random()の箇所です。 通常はこの1.の手順はアプリ内で1度だけ処理します。←ここが対処方法
RandomizeステートメントもNew Random()も引数を取る事ができ、そこで指定した値から どんな乱数列を使用するかが決定されます。この値のことをシード(種)といいます。 同じシードを与えてやると毎回同じ乱数列を発生させることができます。
今回の提示コードのように引数を取らない場合、シードとしてシステム時刻が使われ、乱数列が決定されます。
で、10回のループは一瞬の処理なので、「New Random()」を実行するときのシステム時刻が同時刻になっているものと思います。 そうすると同じシードを与えて乱数列を作っていることになるので、毎ループで同じ乱数列を指定して、 その先頭の数値を取得していることになります。 (上の処理手順の例では、常に3187を取るような処理になっている、ということ)
というのが原因になります。
|