4桁の数字をRnd関数を使って作成しています。1123のように4桁の中に同じ数字が出ないようにしたいと思っています。まず配列を使って乱数を一つづつ入れていき、条件判断で隣同士の数字を比べ同じ数字だったら乱数をつくり直すというようにしているのですが同じ数字が出てしまいます。過去ログも拝見しましたがよく理解できませんでした・・・。本当に初心者な事で申し訳ないのですがよろしくお願いします。
Dim strRndnum(3) As String
For i = 0 To 3
Randomize
strRndnum(i) = Int(Rnd * 10) '乱数を発生させる
Next i
For i = 0 To 2
For j = i + 1 To 3
If strRndnum(i) = strRndnum(j) Then
Randomize
strRndnum(j) = Int(strRndnum(j) * Rnd)
End If
Next j
Next i
一例としてサンプルとして投稿しときます。
説明するの面倒だからデバッグして数値がどのように変化しているのか理解して
ください。ウォッチウィンドウとかで数値の変化を確認すれば流れが掴めるかと。
後、頭が0になる場合があるけど嫌なら適宜、変更して。
Private Sub Form_Load()
Randomize
End Sub
Private Sub Command1_Click()
Dim lngCount As Long
Dim lngCount2 As Long
Dim lngNum(9) As Long
Dim lngDmy As Long
'初期値設定
For lngCount = LBound(lngNum) To UBound(lngNum)
lngNum(lngCount) = lngCount
Next
'数字を混ぜる
For lngCount = LBound(lngNum) To UBound(lngNum)
lngCount2 = Int(Rnd * 10)
lngDmy = lngNum(lngCount2)
lngNum(lngCount2) = lngNum(lngCount)
lngNum(lngCount) = lngDmy
Next
Debug.Print lngNum(0) & lngNum(1) & lngNum(2) & lngNum(3)
End Sub
要はトランプのシャッフルだよね。
GODさん、名無しさんレスありがとうございます。
GODさんのサンプルソースで4桁数字が被らずに表示できますが、今自分が作っているプログラムに使用するとしてもだいたいの動きは理解できるのですが、どう入れていいのかわからないです・・・。でもこういうやり方もあるんだと思いました。
> どう入れていいのかわからないです・・・。
どう入れてよいか分からないということは
理解できていない!と通常は判断していますが・・・。
どういれていいかわからないというのはサンプルの変数と自分の作成しているプログラムの変数のどの名前になるのかとか、皆さんから言わせればもっと考えればわかるだろ。と思われるかもしれませんが・・・
ヒント:
> サンプル変数と
> 自分の作成しているプログラムの変数のどの名前になるのかとか
必要なのはプログラムの挙動だけ、変数の名前なんてどうでもいいです。
考えるべきなのは↓のことだけです。
機能化するために、関数として分離しなければならない。
・入力はなくていい
→この情報から、関数の形は
function foo() as ...
と想像できます。
・出力は4桁の数字の組
→内部の主な処理はGODさんが既に書いておられますので、
あとは、イミディエイトウィンドウに出力するのではなく、
関数の戻り値として設定してあげればいいだけですから、
foo=lngNum(0) & lngNum(1) & lngNum(2) & lngNum(3)
となります。
ヒントでした。
皆さんレスありがとうございました。なんとか解決できそうです!!
ありがとうございました。
ツイート | ![]() |