乱数を生成する方法を解説します。
小数(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関数がある場合は実装されないようですね。