VBA(Visual Basic for Applications)の組み込み関数 Rnd
は、乱数(ランダムな数値)を生成するための関数です。主にシミュレーション、ゲーム、テストデータの生成、ランダムな選択処理など、あらゆる場面で活用されます。Rnd
関数は0以上1未満の擬似乱数を返し、Randomize
ステートメントと組み合わせて使用することで、より自然なランダム性を得ることができます。
■ 1. Rnd関数の基本概要
Rnd
関数は、0以上1未満(0 ≦ x < 1) のランダムな数値(Single
型)を返します。関数の戻り値は実際には「擬似乱数(pseudo-random number)」であり、完全に予測不能な真の乱数ではなく、あくまで一定のアルゴリズムに基づいて生成される値です。
■ 2. 構文
Rnd([number])
パラメータ:
number
(省略可能)
数値を指定することで乱数生成の挙動を変えることができます。
値の種類 | 意味 |
---|---|
省略または > 0 | 次の擬似乱数系列から乱数を返す |
0 | 前回返された乱数と同じ値を返す |
< 0 | 指定値を乱数のシード値として使い、同じ系列を再生成する(再現性) |
戻り値:
Single
型の値(0以上1未満)
■ 3. 基本的な使い方
● 乱数を1回表示する
MsgBox Rnd() ' 例: 0.735219
● 0~9の整数をランダムに生成
Dim num As Integer
num = Int(Rnd() * 10) ' 結果: 0~9の整数
● 1~100の乱数を取得
Dim randNum As Integer
randNum = Int(Rnd() * 100) + 1 ' 結果: 1~100
■ 4. Randomizeステートメント
Rnd
関数は初期シード値に依存して乱数を生成します。プログラムを毎回実行しても同じシードが使われると、同じ乱数の系列が生成されてしまいます。それを防ぐために使うのが Randomize
ステートメントです。
● 使い方
Randomize
MsgBox Rnd()
このように Randomize
を使うと、現在の時刻をもとにしたシード値が自動で設定され、毎回違う乱数列が生成されます。
■ 5. Rndの引数による挙動の違い
引数 | 動作 |
---|---|
省略 | 次の乱数値を返す |
0 | 前回の値と同じ |
<0 | 同じシード値で同じ系列を再生成(再現性) |
● 例:特定の乱数列を繰り返し再現
Dim i As Integer
Randomize 5 ' シード値として「5」を使う
For i = 1 To 5
Debug.Print Rnd(-1) ' 再現性のある乱数列
Next i
■ 6. 応用例
● サイコロのシミュレーション(1~6)
Dim dice As Integer
Randomize
dice = Int(Rnd() * 6) + 1
MsgBox "出た目は:" & dice
● 文字列のランダム選択
Dim fruits() As String
fruits = Split("りんご,バナナ,みかん,ぶどう,もも", ",")
Randomize
Dim index As Integer
index = Int(Rnd() * UBound(fruits) + 1)
MsgBox "今日のフルーツは:" & fruits(index)
● ランダムな文字列生成(英数字)
Function RandomString(length As Integer) As String
Dim i As Integer
Dim result As String
Dim ch As String
Randomize
For i = 1 To length
ch = Chr(Int(Rnd() * 26) + 65) ' A~Z
result = result & ch
Next i
RandomString = result
End Function
' 使用例
MsgBox RandomString(5)
■ 7. 注意点
● Randomizeの場所に注意
Randomize
を 一度だけ先頭で実行すれば、以降の Rnd
では常に異なる系列が得られます。複数回 Randomize を使う必要は通常ありません。
NG例(毎回Randomize):
Randomize
x = Rnd()
Randomize
y = Rnd() ' 毎回Randomizeすると予測困難になる
OK例(1回だけ):
Randomize
For i = 1 To 10
Debug.Print Rnd()
Next i
■ 8. 真の乱数ではない(擬似乱数)
Rnd
が返すのはあくまで擬似乱数です。つまり、決まったアルゴリズムによって計算された「見かけ上ランダム」な数列です。そのため、セキュリティなど真のランダム性が求められる用途には不向きです。
■ 9. 他のランダム処理との違い
機能 | 使用関数 | 特徴 |
---|---|---|
乱数生成 | Rnd | 0以上1未満、擬似乱数 |
シード設定 | Randomize | 時刻ベースまたは任意値 |
ワークシート関数 | RAND() | Excelシートで使用可 |
Application.RandBetween | Excelから整数乱数を得る(VBA内でも可) |
例:
MsgBox Application.WorksheetFunction.RandBetween(1, 100)
■ 10. まとめ
VBA の Rnd
関数は、簡単に乱数を生成できる強力なツールです。Randomize
と組み合わせることで、毎回異なるランダム値が得られ、シミュレーション、データ生成、ランダムな選択処理など、様々な用途に応用可能です。
【重要ポイントのまとめ】
Rnd()
→ 0以上1未満の乱数を生成Randomize
→ シードの初期化(毎回違う乱数を得るために必要)Rnd(-1)
→ 指定シードによる再現可能な乱数列Rnd(0)
→ 前回の値を再取得- 擬似乱数なので完全なランダム性はない(セキュリティ用途には不適)