dポイントプレゼントキャンペーン実施中!

コマンドボタンを押すごとに画像をランダムに表示したいのですが
決まった順番で表示されてしまいます。
(画像はMy Picturesに440個入っています。)

Sub ボタン_Click()
Dim i As Long
'画像をランダムに表示
i = Int((440 - 1 + 1) * Rnd + 1)
Forms("フォーム1").ボタン.Picture = "D:\My Documents\My Pictures\画像" & i & ".ico"
Debug.Print i
End Sub

コマンドボタンを何回かクリックし
上記のコート゛を実行してイミディエイトウインドウで確認すると

311
235
255
128
133
341
7
335
359

となります。

何回やってもこの順番です。
なんの規則かわかりません。
確かにランダムなのですが
本当にランダムにするのはどうすればいいでしょうか?

「i = Int((440 - 1 + 1) * Rnd + 1)」
ここに原因があると思うのですが
どうすればいいでしょう?

よろしくお願いします。

A 回答 (2件)

fujillinさんの回答のとおりだと思います。



各種ランダム関数は疑似ランダムを生成する計算式があるだけで、その計算に使用する[ランダムシード]という値があります。
通常は標準値が決まっているため、プログラムを起動する度に標準シードから乱数を計算するため毎回同じ値が帰ってきます。

よって、毎回異なる数値が必要になる場合にはプログラムのはじめにシードの初期化を行います。
普通はこの時にシードをコンピュータの時計の値(システム タイマー)にします。
(全く同じ年月日時分秒で起動することは希だから)


fujillinさんのアドバイスにある[ Randomize ]は、特に何も指定しない場合にはシステム タイマーを元に初期化するので、
プログラム起動時か、又はボタンイベントの度にRandomizeされるようにしておけば毎回異なる乱数が帰ってくるはずです。

参考URL:http://homepage2.nifty.com/pasocon/nyumon/rnd.html
    • good
    • 0
この回答へのお礼

理由がわかってすっきりしました。
ありがとうございます。

お礼日時:2009/05/08 19:52

Randのヘルプを見ると



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

となっていますので、最初に
Randomize
などで、乱数発生の初期値をランダマイズしておいてあげる必要があるみたい。
    • good
    • 0
この回答へのお礼

Randomize
を加えたらちゃんとランダムされるようになりました。
ありがとうございます。

お礼日時:2009/05/08 19:51

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