0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Excel VBA】Rnd関数|乱数の生成方法とRandomizeとの関係・注意点

Last updated at Posted at 2025-07-08

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でよく使う関数一覧&基本の使い方

参考リンク

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?