シャッフルで同じ番号が出てしまうのですが…

解決


TAKU  2002-09-06 10:39:44  No: 104843  IP: [192.*.*.*]

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

編集 削除
通りすがり  2002-09-06 23:11:16  No: 104844  IP: [192.*.*.*]

ランダムするときは
randomize
    j = Int(Rnd() * 99) + 1 ' 数値をひとつ選ぶ

というようにrandomizeを直前に書かないとランダムにならないっす。

編集 削除
TAKU  2002-09-06 23:23:14  No: 104845  IP: [192.*.*.*]

通りすがりさま、返信ありがとうございます。
ご指摘通り変更させていただきました。が、同じ番号が出てしまうというのは、BINGOカード一枚の中に同じ番号が2つ出てきてしまうと言う事です。

例)79  6  81
    54  7  50
    47  6  66
という風に、6が二つ出てきてしまい、BINGOカードでは無くなってしまいます。
一枚のカードに同じ番号が出ないようにするにはどうしたらいいでしょうか?

編集 削除
通りすがり  2002-09-06 23:51:11  No: 104846  IP: [192.*.*.*]

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は常にかぶらないと思う・・・

編集 削除
TAKU  2002-09-07 00:21:35  No: 104847  IP: [192.*.*.*]

通りすがりさん、返信ありがとうございます。

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
その後のこの部分が分りません。
すみません教えてください。

編集 削除
oku  2002-09-07 00:23:11  No: 104848  IP: [192.*.*.*]

ラベルに出力するタイミングが違うんじゃないかと思います。
シャッフルのFor〜Nextの後で、
For〜Nextで回し、ラベルに出力すればよいと思います。

今のロジックだと入れ替えをしてる最中なので、
ダブります。

編集 削除
TAKU  2002-09-07 00:45:53  No: 104849  IP: [192.*.*.*]

okuさん返信ありがとうございます。
>シャッフルのFor〜Nextの後で、
>For〜Nextで回し、ラベルに出力すればよいと思います。

すみません、具体的にはどうすればいいのでしょうか?

編集 削除
通りすがり  2002-09-07 00:51:52  No: 104850  IP: [192.*.*.*]

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

正確に書けばこういう風になると思うっす。

編集 削除
通りすがり  2002-09-07 01:01:07  No: 104851  IP: [192.*.*.*]

labelに何を出力すればいいのかわからないけど、
僕の場合だと数字が9個、numtmp の中にコンマで区切られた形で入ると思います。

70,53,58,29,30,77,02,76,81

こういう感じで。
あとはこれを分解して各ラベルに、でいけると思います。
10以下の数の前に0がつくのが嫌なら0を消去すればいいです。

編集 削除
通りすがり  2002-09-07 01:03:33  No: 104852  IP: [192.*.*.*]

あと、変数に日本語使うのはやめた方がいいかも・・・
見ててちょっと違和感があるし他の国だと動かないかも

編集 削除
oku  URL  2002-09-07 01:18:22  No: 104853  IP: [192.*.*.*]

シャッフルの所から書きます。
  ' シャッフル
  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 = 出力用
こんな感じですね。

編集 削除
TAKU  2002-09-07 01:42:25  No: 104854  IP: [192.*.*.*]

通りすがりさん、okuさん、返信ありがとう御座います。
二人とも初心者の自分に付き合っていただきありがとう御座います。
無事解決しました。
二人の発想には感心させられます。
がんばろうっと!

編集 削除