Yuoさんのご指摘通りにやってみたのですが、ランダム抽出時、同じ番号がでてしまいます。どごが悪いのか一生懸命探したのですが分りません....
アドバイスお願いします。1〜99までの番号をランダムに取り出し、同じ番号は2度と出てはいけない。
Private Sub Command1_Click()
Dim intNum As Integer
Dim ary(1 To 99) As Integer
Dim i As Integer, j As Integer, Temp As Integer
Dim 出力用 As String
If Not IsNumeric(Text1) Then
MsgBox "Please enter a number for the raws", vbOKOnly, "error"
Exit Sub
End If
If Not IsNumeric(Text2) Then
MsgBox "Please enter a number for the column", vbOKOnly, "error"
Exit Sub
End If
If (Val(Text1.Text) <= 5) And (Val(Text2.Text) <= 4) Then
mintLaw = Val(Text1.Text)
mintCol = Val(Text2.Text)
intNum = mintLaw * mintCol
' 初期化
For i = 1 To 99
ary(i) = i
Next i
' シャッフル
For i = 1 To intNum
j = Int(Rnd() * 99) + 1 ' 数値をひとつ選ぶ
'入れ替え
Temp = ary(j)
ary(j) = ary(i)
ary(i) = Temp
'Set mcards = New BingoNumber
If i = mintLaw Or i = mintLaw * 2 Or i = mintLaw * 3 Or i = mintLaw * 4 Then
出力用 = 出力用 & ary(i) & vbCrLf
Else
出力用 = 出力用 & ary(i) & " " ' " "はスペース
End If
Label1.Caption = 出力用
Next i
Else
MsgBox "The number is error"
Exit Sub
End If
End Sub
ランダムするときは
randomize
j = Int(Rnd() * 99) + 1 ' 数値をひとつ選ぶ
というようにrandomizeを直前に書かないとランダムにならないっす。
通りすがりさま、返信ありがとうございます。
ご指摘通り変更させていただきました。が、同じ番号が出てしまうというのは、BINGOカード一枚の中に同じ番号が2つ出てきてしまうと言う事です。
例)79 6 81
54 7 50
47 6 66
という風に、6が二つ出てきてしまい、BINGOカードでは無くなってしまいます。
一枚のカードに同じ番号が出ないようにするにはどうしたらいいでしょうか?
dim i as integer
dim numtmp as string
i=int(rnd*99)+1
numtmp=i
for n=1 to 8
do while instr(1,numtmp,i)>0
i=int(rnd*99)+1
loop
numtmp=numtmp+"," & i
next
こういう感じかな・・・
たぶんこれでiは常にかぶらないと思う・・・
通りすがりさん、返信ありがとうございます。
do while instr(1,numtmp,i)>0
i=int(rnd*99)+1
loop
numtmp=numtmp+"," & i
この部分のソースはどういった事をやっているのでしょうか?
最後のソースの部分で”型が一致しません”とエラーが出てしまうのですが..
すみません、初心者なもので DO WHILE LOOPの意味はわかりますが、
instr(1,numtmp,i)>0
i=int(rnd*99)+1
その後のこの部分が分りません。
すみません教えてください。
ラベルに出力するタイミングが違うんじゃないかと思います。
シャッフルのFor〜Nextの後で、
For〜Nextで回し、ラベルに出力すればよいと思います。
今のロジックだと入れ替えをしてる最中なので、
ダブります。
okuさん返信ありがとうございます。
>シャッフルのFor〜Nextの後で、
>For〜Nextで回し、ラベルに出力すればよいと思います。
すみません、具体的にはどうすればいいのでしょうか?
Dim i As Integer
Dim n As Integer
Dim stri As String
Dim numtmp As String
i = Int(Rnd * 99) + 1
If i < 10 Then
stri = "0" & i
Else
stri = i
End If
numtmp = stri
For n = 1 To 8
Do While InStr(1, numtmp, stri) > 0 'numtmpにstriが含まれてる間シャッフルを繰り返す
i = Int(Rnd * 99) + 1
If i < 10 Then
stri = "0" & i 'この処理を行わないと完全にシャッフルにならないっぽい
Else
stri = i
End If
Loop
numtmp = numtmp + "," & stri 'numtmp にstriを加える
Next
正確に書けばこういう風になると思うっす。
labelに何を出力すればいいのかわからないけど、
僕の場合だと数字が9個、numtmp の中にコンマで区切られた形で入ると思います。
70,53,58,29,30,77,02,76,81
こういう感じで。
あとはこれを分解して各ラベルに、でいけると思います。
10以下の数の前に0がつくのが嫌なら0を消去すればいいです。
あと、変数に日本語使うのはやめた方がいいかも・・・
見ててちょっと違和感があるし他の国だと動かないかも
シャッフルの所から書きます。
' シャッフル
For i = 1 To intNum
j = Int(Rnd() * 99) + 1 ' 数値をひとつ選ぶ
'入れ替え
Temp = ary(j)
ary(j) = ary(i)
ary(i) = Temp
Next i
' シャッフルした結果を出力
For i = 1 To intNum
If i = mintLaw Or i = mintLaw * 2 Or i = mintLaw * 3 Or i = mintLaw * 4 Then
出力用 = 出力用 & ary(i) & vbCrLf
Else
出力用 = 出力用 & ary(i) & " " ' " "はスペース
End If
Next i
Label1.Caption = 出力用
こんな感じですね。
通りすがりさん、okuさん、返信ありがとう御座います。
二人とも初心者の自分に付き合っていただきありがとう御座います。
無事解決しました。
二人の発想には感心させられます。
がんばろうっと!