和風スパゲティのレシピ

日本語でコーディングするExcelVBA

乱数を生成する - Rnd/Randbetween

乱数を生成する方法を解説します。

小数(0.0~1.0)を生成したい場合はVBAのRnd関数
整数を生成したい場合はWorksheetFunction.RandBetweenを使用します。

小数の乱数を生成する - Rnd

基本構文

Randomize ' マクロ冒頭で一度実行

乱数 = Rnd

サンプルコード

Randomize

Dim 乱数 As Double
乱数 = Rnd

Select Case 乱数
    Case Is <0.1
        ' ※0.0~0.1:10%で起こる処理
        
    Case Is <0.5
        ' ※0.1~0.5:40%で起こる処理
    
    Case Is < 0.9
        ' ※0.5~0.9:40%で起こる処理
        
    Case Else
        ' ※ 0.9~1.0:10%で起こる処理
        
End Select

解説

小数の乱数を生成したい場合はRnd関数を使用します。

Rnd関数は0以上1未満の小数を返しますので、
そのままパーセンテージの小数値で分岐を行うことができます。


分岐にはSelectCaseを用いるのが便利で見やすいと思いますので、
確率による分岐コードの参考にしてください。


Rnd関数には重大な仕様(罠)があり、
ただ使用するだけだと毎回同じ数値を生成します。

これはこれで「同一分布に対してシミュレーション」する際に使える仕様なのですが、
Excelで作るような多くのシミュレーターには困る仕様かと思います。


毎回違う乱数を生成してほしい場合は、
マクロ冒頭でRandomizeメソッドを必ず実行してください。

1度実行すれば、そのマクロの中では複数回実行する必要はありません。


ちなみに0は生成される可能性があり、1は生成されません。

といいつつ0が生成される確率も0といっていいくらいの低確率ですが、
シミュレータを億兆レベルで回す場合はご注意ください。
 

整数の乱数を生成する - RandBetween

基本構文

乱数 = WorksheetFunction.RandBetween(最小値, 最大値)

サンプルコード

Dim 乱数 As Long
乱数 = WorksheetFunction.RandBetween(1, 100)

Select Case 乱数
    Case 1 To 10
        ' ※1~10:10%で起こる処理
        
    Case 11 To 50
        ' ※11~50:40%で起こる処理
    
    Case 51 To 90
        ' ※51~90:40%で起こる処理
        
    Case 91 To 100
        ' ※91~100:10%で起こる処理
        
End Select

解説

整数の乱数を生成したい場合は、
WorksheetFunction.RandBetweenを使用します。

第1引数に最小値、第2引数に最大値を指定すると、
最小値以上、最大値以下の整数が生成されます。


Rnd同様分岐にはSelectCaseを用いるのが便利で見やすいと思いますので、
確率による分岐コードの参考にしてください。

その際「1 To 10」「10 To 50」のように数値が被らないようにご注意ください。

Rndでピッタリ10が出る確率は天文学的な値ですが、
RandBetweenは当然かなりの確率で発生します。


また、これはコードではなく数値的な話になりますが、

WorksheetFunction.RandBetween(0, 100)

↑これは0から100まで「101個」の乱数を生成してしまいます。

1%刻みで確率を表現したい場合は(1, 100)が正しいことにご注意ください。


なお、RandBetweenを使用する場合は、
Randomizeを実行する必要はありません。

シート関数同様こちらは実行するたびに異なる整数が生成されますので、
整数が必要な場合はこちらを使う方が簡単です。


ちなみにWorksheetFunctionならRandomizeがいらないということで、
小数のときにもWorksheetFunction.Randを使いたくなります。

が、WorksheetFunction.Randメソッドは残念ながら存在しません。

Left/Mid/Rightなどのようにほぼ同機能のVBA関数がある場合は実装されないようですね。