VBATips

重複しないランダムな数値を生成する処理をパーツ化する【Rnd関数】【配列】【ExcelVBA】

重複しないランダムな数値を作成したい

1~10までの数値をランダムな順番で取得をしたいケースがあります。
単純なランダム数値は乱数を発生させるRnd関数で可能ですが、重複が許容されます。
重複がない状態でランダムな数値を取得する方法を説明します。

重複しないランダムな数値を生成するサンプルコード

データを格納する配列 arr と既にarrに代入した数値なのかどうか判断する 配列 flgで処理をします。
単純に flg が Trueでないランダムな数値を取得するまでDo WhileでLoopするだけです。

 

Public Function Call_GetRandomNum_NoOverLap(nMax As Long) As Variant
    Dim num As Long
    Dim arr() As Long
    Dim flg() As Boolean

    '■配列定義
    ReDim arr(1 To nMax)
    ReDim flg(1 To nMax)

    
    '■乱数シード値初期化
    Randomize

    Dim i As Long
    '■ランダムな数値をarrに格納後、
    '  再度同じ整数が来た場合は無視し、重複がない状態が来るまで処理し続けるxiの回数分
    For i = 1 To nMax
       Do
          num = Int(Rnd * nMax) + 1
          If flg(num) = False Then
             flg(num) = True
             arr(i) = num
             Exit Do
          End If
       Loop
    Next i
    '■arrを返す
    Call_GetRandomNum_NoOverLap = arr
End Function

実際の使い方

Public Sub sample()
    Dim sample As Variant
    
    sample = Call_GetRandomNum_NoOverLap(5)
    
    Debug.Print sample(1)   '2
    Debug.Print sample(2)   '4
    Debug.Print sample(3)   '3
    Debug.Print sample(4)   '1
    Debug.Print sample(5)   '5
    
End Sub

関連記事

範囲を指定して乱数を発生させる【Rnd関数/Int関数】【ExcelVBA】

コメント

タイトルとURLをコピーしました