• ベストアンサー

乱数がうまくランダムされない

コマンドボタンを押すごとに画像をランダムに表示したいのですが 決まった順番で表示されてしまいます。 (画像は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)」 ここに原因があると思うのですが どうすればいいでしょう? よろしくお願いします。

  • qwfgjo
  • お礼率100% (282/282)

質問者が選んだベストアンサー

  • ベストアンサー
  • Yorisin
  • ベストアンサー率54% (364/663)
回答No.2

fujillinさんの回答のとおりだと思います。 各種ランダム関数は疑似ランダムを生成する計算式があるだけで、その計算に使用する[ランダムシード]という値があります。 通常は標準値が決まっているため、プログラムを起動する度に標準シードから乱数を計算するため毎回同じ値が帰ってきます。 よって、毎回異なる数値が必要になる場合にはプログラムのはじめにシードの初期化を行います。 普通はこの時にシードをコンピュータの時計の値(システム タイマー)にします。 (全く同じ年月日時分秒で起動することは希だから) fujillinさんのアドバイスにある[ Randomize ]は、特に何も指定しない場合にはシステム タイマーを元に初期化するので、 プログラム起動時か、又はボタンイベントの度にRandomizeされるようにしておけば毎回異なる乱数が帰ってくるはずです。

参考URL:
http://homepage2.nifty.com/pasocon/nyumon/rnd.html
qwfgjo
質問者

お礼

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

その他の回答 (1)

  • fujillin
  • ベストアンサー率61% (1594/2576)
回答No.1

Randのヘルプを見ると 『初期シード値が変わらない限り、一連の Rnd 関数が返す乱数系列は同じになります。これは、連続する各 Rnd 関数が乱数系列の中の直前の乱数をシード値として、次の乱数をそれぞれ生成するためです。』 となっていますので、最初に Randomize などで、乱数発生の初期値をランダマイズしておいてあげる必要があるみたい。

qwfgjo
質問者

お礼

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

関連するQ&A

  • 乱数

    乱数を発生させる際に Sub Sample() Debug.Print Int((10 - 1 + 1) * Rnd + 1) End Sub で、1から10までの乱数を発生できますが、 1から10と言う連続した数字ではなく、 例えば10,13,18,43・・・ という規則性のない複数の数字からランダムに数字を発生させるにはどうすればいいでしょうか? 10,13,18,43の中から10を返したり、18を返したりする方法を教えてください。

  • 乱数で・・・

       ラベル10枚に1~10までを乱数を入れたいのです ただしダブらない どうすればいいのでしょうか?? 自分で考えたのですがバグがあります ※コマンドをクリック ※クローンは用意済み Private Sub Command1_Click() Dim a(0 To 9) For i = 0 To 9 a(i) = Int(Rnd * 10)+1  For b = 0 To 9   If a(i) = a(b) Then     If i <> b Then     a(i) = Int(Rnd * 10) + 1     End If   End If   Next b Next i For c = 0 To 9 Label1(c).Caption = a(c) Next c End Sub バグの原因はなんとなくわかるのですがどうすればいいのか分かりません 素人ですいません。

  • ランダムに絵を切り替えたい

    同じ位置にイメージを3枚置きます。 コマンドボタンを押すとそれがランダムに切り替えるようにしたいです。 image1 image2 image3 とイメージがあります。 int(rnd*3)と番号を作って、それを  image(番号).visible.trueに持っていくところが わかりません。 名前の結合? 説明不足ですが、何かお分かりの方がいましたら教えてください。 よろしくお願いします。

  • 乱数 IFステートメント

    Debug.Print Int((11 - 8 + 1) * Rnd + 8) 「これって8~11までの乱数を発生させますよ」 という意味であってますか? そして、 Sub a() Dim 文字数 As Long 文字数 = Int((11 - 8 + 1) * Rnd + 8) If 8 >= 文字数 <= 10 Then MsgBox 文字数 & "は、8~10の間です" End If End Sub を実行すると、11でも MsgBox 文字数 & "は、8~10の間です" が表示されてしまいます。 「8~10の間なら」メッセージボックスを表示するには、 If 8 >= 文字数 <= 10 Then の部分をどうすればいいですか?

  • ランダムで画像を表示させるには?

    環境はFlashCS5で、アクションスクリプト3.0を使用しています。 5枚の画像(インスタンス名:mc0~mc4)をランダムで表示させるムービーを制作しているのですが、 下記のスクリプトですと、ランダムで画像が表示されるのですが、画像の切り替えがループになってしまって、次から次へとランダムで画像が切り替わります。フレーム1に下記のスクリプトを記述し、フレーム1にムービーインスタンス「mc0」から「mc4」を配置しています。 function randomShowMC():void { for (var i:int=0; i<5; i++) { this["mc" + i].visible = false; } var rnd:int = Math.floor(Math.random() * 5); this["mc" + rnd].visible = true; } randomShowMC(); var myTimer:Timer = new Timer(3000); myTimer.addEventListener(TimerEvent.TIMER ,function(){randomShowMC()}); myTimer.start(); このスクリプトを改良?改造?して、ランダムの画像が1回のみ…つまり、おみくじみたいに、(mc0~mc4の画像を)ランダムで1回のみ画像を表示させたいのです…表示後の画像が切り替わらずそのままで停止させたいのです。 又は、ムービーインスタンス「mc0」から「mc4」の画像をランダムで表示させ、最初に表示された、その画像で停止させるスクリプトを新規に記述しても構いませんので、ご指導・アドバイスをお願い致します…。 どなたか、解る方がいましたらランダム画像表示で1回表示のみのループしないスクリプトを教えてください。よろしくお願い致します…。

    • ベストアンサー
    • Flash
  • VB6.0で製作中の「もぐらたたきゲーム」について(補足版)

    昨日しました質問が要領を得ていなくて、回答してくださった皆様すいません。 ランダムで4種類の画像が同時に16個のImageにランダムに表示するようにしています。が、ランダムに表示するなかでも画像がかぶってしまい3種類、もしくは2種類しか表示されなくなってしまっています。どうしたら4種類とも表示できるでしょうか? <コード> Private Sub Form_Load() Randomize End Sub Private Sub Timer1_Timer() n = n + 1 If n <= 20 Then i = Int(Rnd * 16) f = Int(Rnd * 16) s = Int(Rnd * 16) b = Int(Rnd * 16) Image1(i0) = Image4 Image1(f0) = Image4 Image1(s0) = Image4 Image1(b0) = Image4 Image1(i) = Image2 Image1(f) = Image2 Image1(s) = Image5 Image1(b) = Image7 Label1.Caption = " バイキンマンの数 = " & (2 * n) Label3.Caption = " ドキンちゃんの数 = " & n i0 = i s0 = s b0 = b f0 = f Else Timer1.Enabled = False Command1.Caption = " 再度トライ " End If End Sub もっとコードが必要でしたら公開します。

  • 乱数の発生 Randomizeを入れた方が良いのか

    VBAについて教えてください。 --------------------------- Sub Randomizeを入れた場合() Dim intMax As Integer Dim intMin As Integer Randomize intMin = 1 intMax = 10 Debug.Print Int((intMax - intMin + 1) * Rnd + intMin) End Sub --------------------------- Sub Randomizeを入れていない場合() Dim intMax As Integer Dim intMin As Integer intMin = 1 intMax = 10 Debug.Print Int((intMax - intMin + 1) * Rnd + intMin) End Sub --------------------------- 上記二つのマクロを実行しても 同じような結果が得られる気がするのですがRandomizeは必要なのでしょうか? 一つのサブプロシージャーの中で1回しか乱数を発生させないのなら Randomizeを使って乱数を初期化する必要はないのですか?

  • マクロでセルをランダムに並び替えたい

    マクロ初心者です。 Sheet1のB4に1、B1003に1000 というように整数が小さい順番にセルに入力してあり、 Sheet2のB4からB1003までにそれらのセルをランダムに並べ換え、 さらにそれらのセルをSheet3のB4からB1003に大きい順(B4に1000、B1003に1といったように)に並び替えたいのですが、 どうすればいいでしょうか。 Sub 並び替え() Dim RndArr(999, 0) As Variant Dim i As Integer, c As Integer Dim rndTmp As Integer Randomize i = 0 RndArr(i, 0) = Int(1000 * Rnd) + 1 Do Re: rndTmp = Int(1000 * Rnd) + 1 For c = 0 To i If rndTmp = RndArr(c, 0) Then GoTo Re Next c i = i + 1 RndArr(i, 0) = rndTmp Loop Until i > 999 Range("b4.Sheet2", "b1003.Sheet2") = RndArr End Sub 今わかっている状況は上記の通りですが、 このマクロだと、セルを並び替えているのではなく乱数を当てはめているだけなので、 整数が重複してしまいます。 よろしくお願いします。

  • VBAでランダムな並び替えをするには

    エクセルのシート1行目に1~40の数字を連番で記入し、3行目に左のセルから順番にランダムに並べるマクロを以下のように書きましたが、動きません。どこが違っているのでしょうか、ご指導いただけますか。 1  2  3   4  5 ・・・・40 ↓  ↓  ↓  ↓  ↓ 21 35 33 14 20 ・・・・ 以下マクロ '1から40までの数を一列に並べる。 for i=1 to 40 cells(1,i)=i:cells(3,i)="" next i for i=1 To 40 msgbox(40-i+1&"枚から1枚選びます") '1から40までの数をランダムに1つ発生させる。    x=int(rnd()*40)) +1 cells(3,1)=cells(1,x) for j=x+1 to 40 cells(1,j-1)=cells(1,j) next j cells(1-j,x)="" msgbox("確認して下さい") cells(3,1)=cells(6,4) cells(6,4)="" x=int(rnd()*39) +1    cells(3,2)=cells(1,x)     next i  

  • Randomizeがある時とない時の違いがわからな

    vbaです Sub Sample1() Randomize Debug.Print Int((6 - 1 + 1) * Rnd + 1) End Sub Sub Sample2() Debug.Print Int((6 - 1 + 1) * Rnd + 1) End Sub の違いがわからないのですが、 Randomizeはどのような役割をなしてるのでしょうか? Sample1の結果は、 5 3 3 4 3 1 6 5 3 4 で、 Sample2の結果は、 4 5 4 3 4 1 4 1 6 1 5 5 でした。

専門家に質問してみよう