- PR -

Rnd関数に関して

1
投稿者投稿内容
Kira
ぬし
会議室デビュー日: 2004/10/30
投稿数: 252
投稿日時: 2008-05-28 20:32
Vb6.0 Rnd関数に関して質問があります。
MSDNを見ると

初期シード値が変わらない限り、一連の Rnd 関数が返す乱数系列は同じになります。これは、連続する Rnd 関数が乱数系列の中の直前に生成された乱数をシード値として、次の乱数をそれぞれ生成するためです。

と書かれていますが、
Call Randomize(1)
Dim value As Integer
value = CInt(Int((6 * Rnd()) + 1))
MsgBox value

以下のコードを数回ループ実行 毎回 違う値が返ってきます。
Rndを使用して同じ乱数パターンを発生できないのでしょうか?
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2008-05-28 22:09
引用:

Kiraさんの書き込み (2008-05-28 20:32) より:
Rndを使用して同じ乱数パターンを発生できないのでしょうか?


リファレンスマニュアルは、今はちょっと VBScript のほうしか見つけられなかったのですが、たぶん VBScript でも仕様は同じだと思いますが、
http://msdn.microsoft.com/ja-jp/library/cc392461.aspx
の中の、
引用:

メモ 乱数系列を繰り返すには、数値を指定して Randomize ステートメントを実行する直前に、負の引数を指定して Rnd 関数を呼び出します。引数 number に同じ値を指定して Randomize ステートメントを使用しても、前の乱数系列を繰り返すことはできません。


に該当することだろうと思います。
たぶん、
コード:
Call Rnd(-12345)
Call Randomize(1) 
Dim value As Integer 
value = CInt(Int((6 * Rnd()) + 1)) 
MsgBox value 


のようにすれば毎回同じパターンになるでしょう。
乱数の初期化は Randomize でやるというよりも、Rnd の引数に負の値を指定してやる、というのが本来の初期化であり、Randomize がオマケ的な存在なのだろうと思います。独立したステートメントとしてわざわざ存在している Randomize がとてもそんなふうには見えませんけど。

なお、余談ですが、VB の Rnd/Randomize の仕様は30年以上前のものを引きずっているため、とても難解です。再現性を重視するならば、Rnd/Randomize は一切使わずに、自前の擬似乱数のプログラムでやったほうが良いかもしれません。
Kira
ぬし
会議室デビュー日: 2004/10/30
投稿数: 252
投稿日時: 2008-05-29 00:23
unibon様
ありがとうございます。

おっしゃる方法で乱数発生できました。
1

スキルアップ/キャリアアップ(JOB@IT)