VBAで8回乱数処理を実行して0から3までの数字で構成された、8桁の数値を生成するプログラムを作ろうとしています
条件で必ず0から3までの数字が1つは存在しなければならないことです
OK 01201231
NG 03001013 2がない
乱数は以下まで組んでみたのですが、条件に合うプログラムが思いつきません
ご教授お願いします
For cnt = 1 To 8 ransuu = WorksheetFunction.RandBetween(0, 3) Next
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
プログラミング言語上の乱数というのは計算式によって生成される擬似的な乱数です
こういう乱数には色々癖が出てきて、小さい桁ではこの問題のように偏った出力がなされることがあります
ということで、
ransuu = WorksheetFunction.RandBetween(0, 3999)\1000
とでもしてみてはどうでしょう
投稿2020/12/28 12:21
総合スコア88042
0
ベストアンサー
まず、0,1,2,3それぞれを出現させる位置を8桁からランダムに決定してから、
残った4つの桁に乱数をあてはめます。
VBA
1'配列を8桁の数字文字列に変換する関数 2Function ArrayToString(ary As Variant) 3 Dim r As String 4 For i = 0 To 7 5 r = r + CStr(ary(i)) 6 Next 7 ArrayToString = r 8End Function 9 10 11'8桁の乱数を持った配列を生成する関数 12Function RandomNumbers() 13 Dim ary As Variant 14 '数字を格納する配列。-1は数字が決まっていない桁を表す。 15 ary = Array(-1, -1, -1, -1, -1, -1, -1, -1) 16 17 '0,1,2,3それぞれを出現させる位置を8桁からランダムに決定 18 For num = 0 To 3 19 Do While True 20 pos = WorksheetFunction.RandBetween(0, 7) 21 If ary(pos) = -1 Then 22 ary(pos) = num 23 Exit Do 24 End If 25 Loop 26 Next num 27 28 '残った4つの桁に乱数をあてはめる。 29 pos = 0 30 31 For i = 1 To 4: 32 num = WorksheetFunction.RandBetween(0, 3) 33 'すでに数字が決まっている桁はスキップする。 34 Do While ary(pos) <> -1 35 pos = pos + 1 36 Loop 37 ary(pos) = num 38 pos = pos + 1 39 Next i 40 RandomNumbers = ArrayToString(ary) 41End Function 42 43 44Sub Test() 45 Debug.Print RandomNumbers() 46End Sub 47
投稿2020/12/28 10:12
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
とりあえず8桁生成してみて、0~3が含まれているかチェックしてなければ再トライするというロジックでどうでしょう。
vba
1 2Public Function GetRansuu() As String 3 Dim ransuu As String, cnt As Long, Num, ok As Boolean 4 Do 5 ransuu = "" 6 For cnt = 1 To 8 7 ransuu = ransuu & WorksheetFunction.RandBetween(0, 3) 8 Next 9 10 ok = True 11 For Each Num In Split("0 1 2 3") 12 ok = InStr(ransuu, Num) > 0 13 If ok = False Then Exit For 14 Next 15 Loop Until ok 16 GetRansuu = ransuu 17End Function 18 19Sub Test() 20 Debug.Print GetRansuu() 21End Sub
投稿2020/12/28 09:52
編集2020/12/28 10:26総合スコア34075
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。