この人頭いいなと思ったエピソード

昨日しました質問が要領を得ていなくて、回答してくださった皆様すいません。
ランダムで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

もっとコードが必要でしたら公開します。

A 回答 (3件)

設定した数を確実に入れるには



テーブルを準備して、必要な絵を必要個数順番にいれます。

その後でループを(ランダム回数)まわして、入れ替え(元と先はランダム)を行います。

順番が変わるだけなので、設定した絵が出るかと...
    • good
    • 0

すでに、ANo.1さんが回答されていますが、


補足版の前に書き込みましたので、
一応責任があるかと・・・(^^;;

コードの書き方は色々と考えられます。
ANo.1さんがおっしゃる通り配列を使うとか。

難しく考えるより、単純に考えた方がいい場合もあります。
下記コードはANo.1さんの内容をそのままコードにしてみました。

i = Int(Rnd * 16)

Do
f = Int(Rnd * 16)
If f <> i Then Exit Do
Loop

Do
s = Int(Rnd * 16)
If i <> s And f <> s Then Exit Do
Loop

Do
b = Int(Rnd * 16)
If i <> b And f <> b And s <> b Then Exit Do
Loop

単純に乱数の重複をチェックしているだけです。
下手にややこしいコードを書くより、
4種類の乱数程度なら、比較で十分対応出来ると思いますよ。
なお、上のコードはあくまで一例です。
動作の責任は持てませんm(__)m
    • good
    • 0

>i = Int(Rnd * 16)


>f = Int(Rnd * 16)
>s = Int(Rnd * 16)
>b = Int(Rnd * 16)

ここで乱数発生させて各変数に0~15までの値が入りますが、これだと同じ値が入る確立が結構ありますよね。

一番簡単なのは、それまでに発生させた0~15間での値がすでに変数に格納されていたらもう一度乱数を発生させればOKですよね。

ここで注意が必要なのは、再度乱数を発生させる必要があるのは1度だけではなく、重複がなくなるまで繰り返す必要があります。

Do ~ Loopを使って、ループさせてください。


また、2番目の変数なら1番目との重複をチェックするだけでいいですが、
3番目の変数の場合、1番目と2番目の両方と重複しない値を求めないといけません。
もちろん4番目なら1,2,3とすべてとの重複をチェックする必要があります。

こういった場合、うまくロジックを組むには乱数を入れる変数を配列にしたり、ループを組み合わせるといいかと。
なれないと難しいかもしれませんががんばってください。
    • good
    • 0

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


おすすめ情報