• ベストアンサー

乱数で・・・

   ラベル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 バグの原因はなんとなくわかるのですがどうすればいいのか分かりません 素人ですいません。

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

  • ベストアンサー
  • nishi6
  • ベストアンサー率67% (869/1280)
回答No.4

質問にあるコードを余り変えずに修正してみました。 質問では、既に発生させた乱数と照合してますが、一致しない乱数になるまで再度、乱数を発生させる必要があります。 Dim a(0 To 9) As Integer Private Sub Command1_Click()   Dim i As Integer, b As Integer, c As Integer   Randomize   For i = 0 To 9     a(i) = Int(Rnd * 10) + 1     While RndCheck(a(i), i - 1) = False       a(i) = Int(Rnd * 10) + 1 '再度乱数を発生させる     Wend   Next i   For c = 0 To 9     Label1(c).Caption = a(c)   Next c End Sub '既に発生させた乱数と照合して、一致するものがあれば『False』 Function RndCheck(Ransu As Integer, idx As Integer)   Dim j As Integer 'カウンタ   RndCheck = True   For j = 0 To idx     If a(j) = Ransu Then       RndCheck = False       Exit For     End If   Next End Function 異なるアルゴリズムで書いてみました。 乱数発生時に重複しない数値が出せます。既に発生させた乱数に対応するインデックスを次の乱数ででないようにしています。乱数の発生は10回で済みます。ご参考に。 Private Sub Command2_Click()   Const num = 10   Dim rc As Integer '乱数   Dim c As Integer 'カウンタ   Dim r(10) As Integer, idx(10) As Integer '乱数とそのインデックス   Randomize   For c = 1 To num     r(c) = c     idx(c) = c   Next   For c = 1 To num     '既に発生させた乱数は発生させないようにする。Rndに掛ける数値を小さくしていく     rc = Int(Rnd * (num - c + 1)) + 1     '間接的に数値を決定する     Label1(c - 1).Caption = r(idx(rc))     '今発生させた乱数に対するidxを計算対象の最後のidxに書き換える     idx(rc) = idx(num - c + 1)   Next End Sub

kennta111
質問者

お礼

いろんな考え方があるのですね・・・ 回答 ありがとうございます

その他の回答 (4)

  • sorarisp
  • ベストアンサー率58% (7/12)
回答No.5

レスポンスを考えないのであれば     If i <> b Then     a(i) = Int(Rnd * 10) + 1     b = 0            ←この行でbを初期化する。     End If でOKだと思います。

kennta111
質問者

お礼

回答 ありがとうございます

  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.3

ランダム数値を10個発生させ、 大小比較で決定していくのでどうでしょうか? サンプルとして1~10の数値をランダムにだぶらないように表示していくプログラムです。 Private Sub Command1_Click() Dim d(10, 2) As Double Dim wk(2) As Double Dim i%, ii% For i = 0 To 9 d(i, 0) = i + 1 d(i, 1) = Rnd Next i For i = 0 To 9 For ii = i To 9 If d(i, 1) < d(ii, 1) Then wk(0) = d(i, 0) wk(1) = d(i, 1) d(i, 0) = d(ii, 0) d(i, 1) = d(ii, 1) d(ii, 0) = wk(0) d(ii, 1) = wk(1) End If Next ii Next i For i = 0 To 9 MsgBox (d(i, 0)) Next i End Sub

kennta111
質問者

お礼

回答 ありがとうございます

  • yuizuian
  • ベストアンサー率42% (103/245)
回答No.2

どういったバグなのか書いておいて欲しかったです。 やり方としては、 1.1~10までの数値を取得 2.結果を配列に格納 3.1~10までの数値を取得 4.以前に出た結果でなければ配列に格納 5.3と4の繰り返し で良いかな…と。 以前に出ているかどうかは結果を格納している配列を調べればわかります。 ところで、kennta111さんのソースでは、 毎回同じ数字がでませんか? 最初のa(i) = Int(Rnd * 10)+1 の前ででも Randomizeして乱数を初期化しておかないと。 それから、 Int(Rnd * 10) + 1 ではなくて Int((Rnd * 10) + 1 ) かなぁ、と。

kennta111
質問者

お礼

すいません 書くの忘れていました 回答 ありがとうございます

  • ceita
  • ベストアンサー率24% (304/1218)
回答No.1

方針としては、 1~10までのカード(配列)をつくって、 カードをシャッフル(ランダムに入れ替える)と いうのがよくとられるようですよ。

kennta111
質問者

お礼

回答 ありがとうございます

関連するQ&A

  • VBAの乱数について質問

    乱数 x (0<x<1)を0.1刻みで発生させたいんですが うまくいきません。 プログラム例 Sub 一様乱数() Dim bin#(10) n = 1000 For m = 1 To 10 bin#(m) = 0 Next m For J = 1 To n x = Rnd(1) ix = Int(10 * Rnd(1)) bin#(ix) = bin#(ix) + 1 Next J Cells(4, 1) = " I" Cells(4, 2) = "Bin#(I)度数分布" For I = 0 To 10 Cells(I + 5, 1).Value = I Cells(I + 5, 2).Value = bin#(I) Next I End Sub ここで、9行目ix = Int(10 * Rnd(1))で0.1刻みになり 15行目のFor I = 0 To 10を0 to 1に変えればできると思ったんですが できませんでした。 どこが問題なのかヒントでもいいので教えてください。

  • 擬似マインスイーパー

    任意の地雷を設置するというプログラムです。 この中で地雷を*に、安全地帯を空白にしたいのですがやり方がわからないので、わかる方お願いします。 Sub mine() Dim minefield(11, 13) As Integer Dim i As Integer, a As Integer, b As Integer Dim c As Integer c = InputBox("地雷の数を決めます") Randomize For i = 1 To c a = Int(Rnd * 10) + 1 b = Int(Rnd * 12) + 1 If minefield(a, b) = 9 Then i = i - 1 minefield(a, b) = 9 Next i countMine minefield, 10, 12 showInt minefield, 10, 12 ' show minefield, 10, 12 End Sub Sub countMine(f() As Integer, h As Integer, w As Integer) Dim i As Integer, j As Integer Dim a As Integer, b As Integer Dim x As Integer For a = 1 To 10 For b = 1 To 12 If f(a, b) < 9 Then x = 0 If f(a, b - 1) = 9 Then x = x + 1 '左に地雷があるか If f(a, b + 1) = 9 Then x = x + 1 '右に地雷があるか ' ... この部分に追加したいのだが ... f(a, b) = x End If Next b Next a End Sub Sub showInt(f() As Integer, h As Integer, w As Integer) Dim i As Integer Const a As Integer = 7 Const b As Integer = 3 Do While h > 0 For i = 1 To w Cells(a + h, b + i) = f(h, i) Next i h = h - 1 Loop End Sub

  • マインスイーパーもどき(VBA)

    ExcelのVBAでマインスイーパーもどきを作っていますが、どうも上手くいきません。9が地雷で0が何もないと言うことです。以下、ソースです。 Sub mine() Dim minefield(11, 13) As Integer Dim i As Integer, a As Integer, b As Integer, x As Integer x = 0 Randomize For i = 1 To 20 a = Int(Rnd * 10) + 1 b = Int(Rnd * 12) + 1 If minefield(a, b) = 9 Then x = x + 1 i = i - 1 End If minefield(a, b) = 9 Next i MsgBox "地雷が" & x & "回重複" countMine minefield, 10, 12 showInt minefield, 10, 12 show minefield, 10, 12 End Sub Sub show(f() As Integer, h As Integer, w As Integer)  Dim a As Integer, b As Integer For a = 1 To 10 For b = 1 To 12 If (f(a, b) = 9) Then CStr(f(a, b)) = "*" If (f(a, b) = 0) Then CStr(f(a, b)) = " " Next b Next a End Sub If (f(a, b) = 9) Then CStr(f(a, b)) = "*" If (f(a, b) = 0) Then CStr(f(a, b)) = " " の部分でコンパイル時に 「コンパイルエラー:修正候補 識別子」 とでます。ヘルプを見てもよくわかりませんでした。 テキストが長すぎるので途中は省きました。 よろしくお願いします。

  • 重複しない乱数整数を発生させる。

    重複しない乱数整数を発生させるため、次のような構文を作りましたが、うまくいきません。 アドバイスをお願いします。 Sub RRR() Dim A, B, C, D, E As Integer A = 1 B = 10 For D = A To B Randomize E = Int((B - A + 1) * Rnd + A) Cells(D, 1) = E Next D End Sub

  • このマクロの繰り返し?

    もう、なにがなんやらで・・・ このマクロの繰り返しを入れ子で出来ないでしょうか? 加算しながら増やしていくので、わけわからなくなりそうです。 Option Explicit Sub hiat() Cells.Clear Dim s As Long, a As Long, b As Long, c As Long, d As Long, e As Long For a = 1 To 31 s = Rnd * 4 Cells(a, 1) = s If s >= 4 Then Exit For '4がでたら終わり。 Next For b = 2 To 31 s = Rnd * 4 Cells(a, b) = s If s >= 4 Then Exit For '4がでたら終わり。 Next Cells(a + 1, b).Select 'セルの移動 Cells(a + 1, b).Activate For c = 1 To 31 - a s = Rnd * 4 ActiveCell(c) = s If s >= 4 Then Exit For '4がでたら終わり。 Next Cells(a + c, b + 1).Select 'セルの移動 Cells(a + c, b + 1).Activate For d = 1 To 31 - a - c s = Rnd * 4 ActiveCell(d) = s If s >= 4 Then Exit For '4がでたら終わり。 Next Cells(a + c + d - 1, b + 2).Select 'セルの移動 Cells(a + c + d - 1, b + 2).Activate For e = 1 To 31 - a - b - c - d s = Rnd * 4 ActiveCell(e) = s If s >= 4 Then Exit For '4がでたら終わり。 Next Cells(a + c + e - 1, b - 1 + d + 1).Select 'セルの移動 Cells(a + c + e - 1, b - 1 + d + 1).Activate End Sub

  • エクセルVBAラベルの変数?

    エクセル2000VBAにて下記のように作成しました。 With ActiveSheet For i = 4 To 200 If Label1.Caption = .Cells(i, 1) Then For h = 4 To 34 If Label25.Caption = .Cells(2, h) Then For idx = i To 200 If .Cells(idx, 3) = Label21.Caption Then Label6.Caption = .Cells(idx, h) Label7.Caption = .Cells(idx + 2, h) GoTo ラベル2 End If Next idx End If Next h End If Next i ラベル2: For i = 4 To 200 If Label2.Caption = .Cells(i, 1) Then For h = 4 To 34 If Label25.Caption = .Cells(2, h) Then For idx = i To 200 If .Cells(idx, 3) = Label21.Caption Then Label8.Caption = .Cells(idx, h) Label9.Caption = .Cells(idx + 2, h) GoTo ラベル3 End If Next idx End If Next h End If Next i ラベル3: ・・・ End With Label1~5まで同じ処理を行うため 1~5まで変数を使用して簡単にしたいのですが Label(変数)の書き込み方がわかりません? 検索を使用しましたが検索項目が悪いのか なかなか解決しません。 何方か教えていただけないでしょうか?

  • 【Excel】セルに入れた数字だけ同じことを繰り返す【VBA】

    A1のセルに数値を入れ、マクロを実行させたときに A1に入れた数値だけ同じ行動を行うというプログラムを作りたいのですが、 うまくいきません。 VBAで実行させたいです。 Sub Macro1() c = 1 For a = 1 To 54 Cells(2, 2) = a b = Int(54 * Rnd + 1) If Cells(10, b) = 0 Then Cells(10, b) = c: c = c + 1: Cells(1, a) = b Else a = a - 1 Next a End Sub 未だたたき台なプログラムですが、これを元に作成できないでしょうか?

  • vba boolean変数を開放する方法

    エクセルのセルに「○○○○○○○○○○××××××××××」と入っているものをランダムに並べ代えるマクロを探してみました。 Sub macro2() Dim i, m As Integer Dim b, c As String Dim flg(1 To 20) As Boolean b = Cells(1, 1).Value Randomize For i = 1 To 20 Do m = Int(20 * Rnd + 1) If flg(m) = False Then flg(m) = True Exit Do End If Loop c = c & Mid(b, m, 1) Next i Cells(1, 2).Value = c End Sub これはうまく動くのですが、10行分やろうとして、以下のように変更すると暴走(終わらない)します。 Sub macro2() Dim i, m, n As Integer Dim b, c As String Dim flg(1 To 20) As Boolean For n = 1 To 10 b = Cells(n, 1).Value Randomize For i = 1 To 20 Do m = Int(20 * Rnd + 1) If flg(m) = False Then flg(m) = True Exit Do End If Loop c = c & Mid(b, m, 1) Next i Cells(n, 2).Value = c next n End Sub 一行目が終わってもboolean変数の値がそのまま残っているのが原因らしいのですが開放する方法がわかりません。 取りあえずもう一つマクロを追加してやりたいことはできたのですが、 Sub macro1() Dim n As Integer For n = 1 To 10 Call macro2(n) Next n End Sub Sub macro2(n As Variant) 以下略 なんかスッキリしません。 boolean変数を開放し、マクロひとつですます方法を教えて頂きたくお願いします。 flg(m) = Falseを挿入してもダメでした。

  • VBA 乱数と配列

    VBA 乱数と配列 配列(0)~配列(5)の一次元配列の中に、1から6までの数字を重複しないように入れたいのですが、 上手くいきません。 ご指導の程、お願いします。 Sub rndsys() Dim 配列(5) As Integer Dim サイコロ As Integer Dim カウントA As Integer Dim カウントB As Integer Dim フラグ As Integer For カウントA = 0 To 5 Do サイコロ = Int(Rnd(1) * 6) + 1 For カウントB = 0 To 5 If 配列(カウントB) = サイコロ Then フラグ = フラグ + 1 End If Next カウントB Loop Until フラグ > 0 配列(カウントA) = サイコロ Next カウントA MsgBox 配列(0) & vbCrLf & 配列(1) & vbCrLf & 配列(2) & vbCrLf & 配列(3) & vbCrLf & 配列(4) & vbCrLf & 配列(5) End Sub

  • 重複しない乱数発生

    初めて投稿させて頂きます。 サイコロを振って、一度出た目はもう出ないような ゲームをプログラミングしています。 Dim i As Integer Dim j As Integer Dim t As Integer Dim r(6) As Integer 'コンピュータ Dim b As Integer 'プレイヤー Private Sub Command1_Click() b = Val(Text2.Text) Randomize r(6) = Int(Rnd * 6 + 1) '1~6までの乱数発生 Text1.Text = r(6) For i = 1 To n r(i) = i 'r(i)~r(n)に1~nの値を格納 Next i For i = n To 2 Step -1 j = Int((i - 1) * Rnd() + 1) '1~i-1の範囲の乱数 t = r(i): r(i) = r(j): r(j) = t 'r(i)とr(j)の交換 Next i For i = 1 To n Text1.Text = r(i) Next i If r(i) < j Then Label2.Caption = "あなたの勝ちです" Else Label2.Caption = "あなたの負けです" End If 幾つか考えてこれで落ち着いたのですが、これでは まだ重複してしまいます。 どこが問題なのかご指摘頂けるようお願いします。 一度出た目は出ないようにするので、全部で6回試行 することになります。またその6回分の結果を表示したいのですが、 Text3.Text = r(1) Text4.Text = r(2) Text5.Text = r(3) Text6.Text = r(4) Text7.Text = r(5) Text8.Text = r(6) としてしまうと全てに0が表示され、結果が表示されません。 これについても回答をお願いします。 まだ初心者ですが、よろしくお願いします。