PR

【VBA】乱数を発生させる、重複させない方法など

これで楽に!?VBA活用
記事内に広告が含まれています。

こんにちは、Ryoです。
Excelを扱っていると用途によって乱数を発生させたいことがあるかと思います。その場合はRnd関数を用いることで規則性のないランダムな数値を発生させることが出来ますので、今回はその内容と参考として乱数を重複させない方法について書いていきます。

スポンサーリンク

1.Rnd関数

Rnd関数とは、0~1未満の値をランダムに発生させることができるものです。

Rnd(number)

構文としてはこの通りなのですが、引数のnumberは省略して使用することが一般的なので、本記事では省略しています。引数などの詳細についてはこちらのMSDNがわかりやすいので、あわせてご確認ください。

この場合0~1未満の数値をランダム生成なので、例として以下コードを実行してみます。

Sub Sample1()

 Dim i As Integer
 
 For i = 1 To 10
   '乱数系列の初期化
   Randomize
   'B列にRnd()実行結果を書込み
   Cells(i + 1, 2) = Rnd()
 Next i
 
End Sub

セルB2~B11にRnd()を実行した結果を書き込んでいますが、0~1の範囲になっていますので、実運用するためには任意の範囲設定をする必要があります。

この任意の範囲設定は上述で紹介したMSDNにも記述がある通り、次のようになります。

Int(Rnd()*(最大値-最小値+1)+最小値)

本例では整数で任意の範囲を選択するものとして、Int関数を使用します。これは指定する数値の小数を切り捨てて整数部分を返してくれるものです。

この式を用いて「1~10」の範囲で乱数を発生させてみる場合は以下のコードになります。対比用としてB列にRnd()の実行結果、C列にはB列でランダム生成した数値に対し、上述の数式を適用した結果を表示します。

Sub Sample2()
 
 Dim i As Integer

 For i = 1 To 10
   '乱数系列の初期化
   Randomize
   'B列にRnd()の実行結果
   Cells(i + 1, 2) = Rnd()
   '対比用としてB列のランダム数値を基に
   'C列に「1~10」範囲指定の数式適用
   Cells(i + 1, 3) = Int(Cells(i + 1, 2) * 10 + 1)
  Next i
 
End Sub

このコードではBとC列に跨って処理しているので、数式を適用した部分がCells(i + 1, 3) = Int(Cells(i + 1, 2) * 10 + 1)となっていますが、通常であれば =Int(Rnd()*10)+1でOKです。

Int(Rnd()*(最大値ー最小値+1)+最小値)

=INT(Rnd()*(10-1+1)+1)

=Int(Rnd()*10+1)・・・これで1~10範囲の乱数が生成されます。

2.Randomizeステートメント

サンプルコード内に記述してある「Randomize」ですが、これは「乱数系列を初期化」するステートメントです。

「乱数系列」=規則性のないランダムな数値の並び順

なぜこれが必要かと言いますと、乱数はシード値と呼ばれる値を元にして作成されますので、この元のシード値が同じ=乱数系列も同じになってしまいます。その為、Rnd関数を使う場合はRandomizeを併せて使用し異なるシード値で乱数を発生させる処理が必要になります。

この理由により本サンプルではFor文内に記述することで、都度「乱数系列を初期化」しています。

◆参考:乱数を重複させない例

例えば「1~10」までの乱数を発生させるサンプルに対し、重複させたくない場合は以下のような処理の仕方もあります。

Sub Sample3()
    Dim i, Num As Integer
    '配列1~10を識別用として使用
    Dim Ide(1 To 10) As Integer
    Randomize
    For i = 1 To 10
        Do
          Num = Int(Rnd() * 10 + 1)
        'Int型配列初期値=0なので、整合すればセル書き込み
        Loop Until Ide(Num) = 0
        Cells(i + 1, 4) = Num
        '処理済みの配列No.には1を代入する
        Ide(Num) = 1
    Next i
End Sub

やり方は色々あると思いますが、ここでは空の整数型配列を1~10用意しています。これはInt型の初期値が”0″なので、生成した乱数が1から10の何れかの数値ですから、その乱数値を配列No.として捉えてループ処理終了の条件を配列格納値の「”0″か否か」としています。

“0”であれば該当セルに書込み処理を行い、その後対象配列には”1″を代入することで、次ループ処理の条件から外れる為重複が防げるということになります。

3.まとめ

今回は乱数に関する記事なので利用頻度自体は多くないかもしれませんが、例えば抽選や抽出、シュミレーションなどには用途があると思いますので知っておいて損はないでしょうから、機会があれば活用をご検討くださいませ!




以上、乱数を発生させる方法についてでした!今回の記事が何かの参考になれば幸いです。

Ryo

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