質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

3回答

946閲覧

VBA 乱数の繰り返し

yakumo02

総合スコア103

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2020/12/28 08:54

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ページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

プログラミング言語上の乱数というのは計算式によって生成される擬似的な乱数です
こういう乱数には色々癖が出てきて、小さい桁ではこの問題のように偏った出力がなされることがあります
ということで、

ransuu = WorksheetFunction.RandBetween(0, 3999)\1000

とでもしてみてはどうでしょう

投稿2020/12/28 12:21

y_waiwai

総合スコア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
hatena19

総合スコア34075

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問