- ベストアンサー
VBA 乱数と配列 - 1から6までの数字を重複しないように配列に入れたい
- VBAを使用して、一次元配列に1から6までの数字を重複しないように入れる方法を教えてください。
- 上手く行っていないため、ご指導の程お願いします。
- また、VBAの乱数生成方法についても教えていただけると助かります。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
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 フラグ = 0 'リセット サイコロ = Int(Rnd(1) * 6) + 1 For カウントB = 0 To 5 If 配列(カウントB) = サイコロ Then フラグ = フラグ + 1 End If Next カウントB Loop While フラグ > 0 '条件変更 配列(カウントA) = サイコロ Next カウントA MsgBox 配列(0) & vbCrLf & 配列(1) & vbCrLf & 配列(2) & vbCrLf & 配列(3) & vbCrLf & 配列(4) & vbCrLf & 配列(5) End Sub '全ての順番が等確率で出るとは思うけどちょっと自信ない。
その他の回答 (4)
- nag0720
- ベストアンサー率58% (1093/1860)
次のような簡単な方法もあります。 Sub rndsys() Dim 配列(5) As Integer Dim サイコロ As Integer Dim カウントA As Integer Dim カウントB As Integer For カウントA = 0 To 5 配列(カウントA) = カウントA + 1 Next カウントA For カウントA = 0 To 5 カウントB = カウントA + Int(Rnd() * (6 - カウントA)) サイコロ = 配列(カウントA) 配列(カウントA) = 配列(カウントB) 配列(カウントB) = サイコロ Next カウントA MsgBox 配列(0) & vbCrLf & 配列(1) & vbCrLf & 配列(2) & vbCrLf & 配列(3) & vbCrLf & 配列(4) & vbCrLf & 配列(5) End Sub
- nattocurry
- ベストアンサー率31% (587/1853)
Sub rndsys() Dim 配列(5) As Integer Dim サイコロ(6) As Integer Dim カウントA As Integer Dim カウントB As Integer For カウントA = 1 To 6 サイコロ(カウントA) = カウントA Next カウントA For カウントA = 6 To 1 Step -1 サイコロ(0) = Int(Rnd() * カウントA) + 1 配列(6 - カウントA) = サイコロ(サイコロ(0)) For カウントB = サイコロ(0) To カウントA - 1 サイコロ(カウントB) = サイコロ(カウントB + 1) Next カウントB Next カウントA MsgBox 配列(0) & vbCrLf & 配列(1) & vbCrLf & 配列(2) & vbCrLf & 配列(3) & vbCrLf & 配列(4) & vbCrLf & 配列(5) End Sub
- merlionXX
- ベストアンサー率48% (1930/4007)
重複排除のためにDictionaryオブジェクトを利用する方法です。 Sub Test() Dim myDic As Object '変数宣言 Dim i As Integer, Dyce As Integer Dim myAr(5) Set myDic = CreateObject("Scripting.Dictionary") 'myDicを用意 Randomize Do While i < 6 Dyce = Int(Rnd(1) * 6) + 1 If Not myDic.exists(Dyce) Then 'myDicになければ myDic.Add Dyce, "" 'myDicに追加 myAr(i) = Dyce '配列に追加 i = i + 1 'カウント End If Loop MsgBox Join(myAr(), vbCrLf), vbInformation, " ( ̄ー ̄)v" Set myDic = Nothing End Sub
- watabe007
- ベストアンサー率62% (476/760)
Randomize For カウントA = 0 To 5 Do サイコロ = Int(Rnd() * 6) + 1 If IsError(Application.Match(サイコロ, 配列, 0)) Then 配列(カウントA) = サイコロ Exit Do End If Loop Next MsgBox 配列(0) & vbCrLf & 配列(1) & vbCrLf & 配列(2) & vbCrLf & 配列(3) & vbCrLf & 配列(4) & vbCrLf & 配列(5)