Rnd関数の使い方と注意点(Randomizeとの関係性)
Rnd関数は、0 以上 1 未満の乱数を返す関数です。
ランダムな値が必要な場面でよく使われますが、使い方によっては「毎回同じ乱数が出る」などの落とし穴もあります。
構文
Rnd(数値)
引数の値によって、関数の動きが次のように変わります。
引数の値 | 動作 | 説明 |
---|---|---|
省略 または 正の数 | 新しい乱数を返す | 通常の使用方法。乱数系列が1つ進み、新しい値が得られます。 Randomizeとの併用が推奨。 |
0 | 前回の乱数を再度返す | 直前に生成された値と同じ乱数を返します。 系列は進みません。 |
負の数 | 固定の乱数値を返す | 引数をシード値として利用し、同じ値を繰り返し返します。 テストやデバッグに便利です。 |
戻り値は常に「0以上1未満」の**単精度浮動小数点数(Single型)**を返します。
使用例
Sub Sample()
Randomize
Debug.Print "省略 : " & Rnd()
Debug.Print "正の数 : " & Rnd(1)
Debug.Print "ゼロ : " & Rnd(0)
Debug.Print "負の数1回目 : " & Rnd(-1)
Debug.Print "負の数2回目 : " & Rnd(-1)
End Sub
▶ 出力結果
省略 : 0.3478423
正の数 : 0.384738
ゼロ : 0.384738
負の数1回目 : 0.224007
負の数2回目 : 0.224007
引数に応じて違う値、直前の値、固定の値が出力されることが分かります。
⚠️注意
戻り値は0以上1未満のsingle型
Sub Sample()
Randomize
Debug.Print "省略 : " & Rnd() & " : " & TypeName(Rnd())
Debug.Print "正の数 : " & Rnd(1) & " : " & TypeName(Rnd(1))
Debug.Print "ゼロ : " & Rnd(0) & " : " & TypeName(Rnd(0))
Debug.Print "負の数 : " & Rnd(-1) & " : " & TypeName(Rnd(-1))
End Sub
▶ 出力結果
省略 : 0.3394496 : Single
正の数 : 0.2934263 : Single
ゼロ : 0.8846557 : Single
負の数 : 0.224007 : Single
Rnd関数は常に「0以上1未満」の**単精度浮動小数点数(Single型)**を返します。
特定の範囲の整数が欲しい場合はスケーリング
出力される値を特定の範囲内にしたい場合は以下に当てはめて記述します。
Int(Rnd * (上限 - 下限 + 1)) + 下限
例えば1~10の値で出力したい場合は
Sub Sample()
Randomize
Debug.Print Int(Rnd() * 10) + 1
Debug.Print Int(Rnd() * 10) + 1
Debug.Print Int(Rnd() * 10) + 1
End Sub
▶ 出力結果
8
6
1
同じ乱数が出ることがある
Rnd(負の数) のあとに Rnd() を使うと、常に同じ乱数が返る
Rnd(負の数) は、指定された値をもとに乱数系列を初期化し、対応する最初の値を返します。
その後 Rnd() を実行すると、その初期化された系列に基づく2番目の値が返されます。
例 : Randomizeなし
Sub Sample()
Rnd(-1)
Debug.Print Rnd()
End Sub
▶ 出力結果(1回目)
3.584582E-02
▶ 出力結果(2回目)
3.584582E-02
▶ 出力結果(3回目)
3.584582E-02
対策 : Randomize を呼ぶ
Sub Sample()
Rnd(-1)
Randomize
Debug.Print Rnd()
End Sub
▶ 出力結果(1回目)
0.1554747
▶ 出力結果(2回目)
0.6510802
▶ 出力結果(3回目)
0.4804412
実行のたびに異なる乱数が得られます。
Randomizeステートメントとは?
Randomize
は現在時刻に基づいて乱数の初期化(シードの設定)を行うステートメントです。
簡単に言えば、Rnd関数で返される乱数を毎回違うものにするために使うものです。
Sub Sample()
Randomize
Debug.Print Rnd()
End Sub
その他のVBA関数
【Excel VBA】VBAでよく使う関数一覧&基本の使い方