Excelの作業で切っても切り離せない乱数ですが、VBAでは、Rnd関数を使用します。今回は簡単なその使い方をご紹介します。
Rnd関数の使い方
Rnd関数は、0以上1未満の乱数を返します。構文は下記です。
1 |
Rnd(引数:作成方法) |
引数は数値で省略可です。値によって、乱数の作成方法が異なります。
- <0 引数のシード値によって決まる同じ数値を返します。
- >0 乱数系列※(乱数ジェネレータとも言う)の次の乱数を返します。
- =0 直前に生成した乱数を返します。
- 省略時 乱数系列の次の乱数を発生させます。
※乱数系列とは、VBAが作成する乱数のセットで、Rnd関数を実行するとこのセットから乱数を出力します。
独立した乱数(前回の結果を引きずらない乱数)を発生させたいのであれば、Randomizeステートメント+Rnd(引数省略)でひとまずOKです。(Randomizeステートメントは、乱数系列をリセットします)。下記に例を示します。
1 2 3 4 5 6 7 8 |
'乱数を発生させる Dim i As Long, j As Long For i = 1 To 5 For j = 1 To 10 Randomize '乱数系列初期化 Cells(i, j).Value = Rnd 'Rnd関数実行 引数なし Next j Next i |
- i,jを定義して、セルの範囲を指定する。
- 指定したセルにRnd関数で乱数を発生させる。(繰り返す際にRandomizeで系列を初期化)
という手順になっています。
乱数の範囲を指定する:Int
サイコロの目のように、最小値~最大値の整数値を乱数として出力させたい場合は、次のようにします。
1 |
<strong>Int((最大値-最小値+1)* Rnd +最小値))</strong> |
Int関数は、指定した数値の整数部分を、小数点以下切り捨てにして返します。特に、1からある値Nまでの乱数を発生させたい場合、最小値=1ですから、
Int((N-1+1)* Rnd+1))
→ Int(N*Rnd+1)
となります。Int関数は小数点以下を切り捨てますので、例えば1~6で乱数を発生させたい場合、最後の「+1」がないと6*Rnd=5.99999…~0の中で小数点以下を切り捨ててしまうので、0~5の間で生成されてしまいます。最後の+1を忘れないようご注意ください。
下記例は、サイコロの目に見立てて1~6の乱数を20回発生させています。
1 2 3 4 5 |
Dim j As Long For j = 1 To 20 Randomize '乱数系列初期化 Cells(1, j).Value = Int(6 * Rnd + 1) '1~6で乱数生成 Next j |
- jを定義して発生させるセルを指定する。
- 指定したセルにint関数で乱数を生成する。(繰り返す際にRandomizeで系列を初期化)
という手順になっています。
[実行結果]
使用例
下記は、Select~Case文を併用して、今夜の夕食をランダムに選ぶプログラムを組みます。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Dim Dice As Integer, Menu As String Dice = Int(3 * Rnd + 1) '1~3をランダム生成 Select Case Dice Case Is = 1 Menu = "焼肉" Case Is = 2 Menu = "鍋" Case Is = 3 Menu = "抜き" End Select Debug.Print "今夜は" & Menu & "!" |
- Int関数でDiceの数字を1~3からランダムに生成する。
- それぞれの数字が出た際に表示する文字を決定する。
- Debug.Printで表示する。
という手順になっています。