VB6・VBA関数メモ:Rnd関数

Rnd関数についてメモしておきます。

この関数は乱数(ランダムな数値)を取得したい時に使用します。
取得できる数値が0≦Rnd<1の小数なので、整数を取得したい場合は取得した値を加工する必要があります。

Rnd関数を使用する前にRandomizeステートメントでシード値の変更を行わないと
毎回(アプリケーションを起動する都度)同じパターンの値しか取得できないので注意です。

なお、Rnd関数で取得できる値は真の乱数ではなく疑似乱数になります。
疑似乱数とは、特定の計算式にシード値をあてはめて計算した値を取得する乱数になります。

取得する値も、前回実行時の値を元に計算しているらしく、
このため同じのシード値を使うと同じパターンの乱数パターンが取得できてしまいます。
(逆に、同じ乱数パターンを繰り返すという使い方もできますが)

また、この仕組みのため何度もRnd関数を実行すると同じ乱数パターンに戻ってしまうようです。(1677万くらいらしいです)


概要

Rnd([Number]) As Single
機能 0以上1未満の乱数を返す
引数 Number (省略可)
任意の数値
省略時は正の数値
Variant型
戻り値 0以上1未満の乱数 Single型


使用例

説明 記述例 出力
乱数を取得 Rnd() 0.5795186
Rnd(123) 0.5795186
Randomizeステートメントでシード値を設定
(初回実行時の値を変える)
Randomize
Debug.Print Rnd()
0.1897662
直前の乱数を取得
(直前の同じ値が返る)
Debug.Print Rnd()
Debug.Print Rnd(0)
Debug.Print Rnd(0)
0.5795186
0.5795186
0.5795186
シード値によって決まっている値を取得
(同じ負の数値だと常に同じ値が返る)
Debug.Print Rnd(-1)
Debug.Print Rnd(-2)
Debug.Print Rnd(-3)

Debug.Print Rnd(-1)
Debug.Print Rnd(-2)
Debug.Print Rnd(-3)
0.224007
0.7133257
0.9633257
0.224007
0.7133257
0.9633257


応用例

説明 記述例 出力
整数の乱数を取得
(例では3〜7の範囲の乱数を取得)
'機能:指定範囲の乱数を整数で取得
'引数:min:最小値
'    :max:最大値
'戻値:整数の乱数
Function Rnd2(ByVal min As Long, _
              ByVal max As Long) As Long
  Rnd2 = Int(Rnd() * (max - min + 1)) + min
End Function
Randomize
Debug.Print Rnd2(3, 7)
Debug.Print Rnd2(3, 7)
Debug.Print Rnd2(3, 7)
Debug.Print Rnd2(3, 7)
Debug.Print Rnd2(3, 7)
5
3
6
7
5
6
同じ乱数を繰り返す
(1)Timer関数でシード値を作成
(2)シード値を変数に保持
(3)Rnd(-1)で実行回数を初期化
(4)Randomizeステートメント
   変数に保持したシード値を指定
(5)Rnd関数で乱数取得
(6)(3)〜(5)の繰り返しで同じ乱数が取得可能
Dim seed As Single
seed = Timer()

Rnd -1
Randomize seed
Debug.Print Rnd
Debug.Print Rnd
Debug.Print Rnd

Rnd -1
Randomize seed
Debug.Print Rnd
Debug.Print Rnd
Debug.Print Rnd
4.429919E-02
0.2172422
0.3028442
4.429919E-02
0.2172422
0.3028442


動作検証

説明 記述例 出力
Randomizeステートメントを指定せずに
Rnd関数を実行すると
アプリケーションを起動する都度
同じ値を取得する
'アプリケーション起動

Debug.Print Rnd
Debug.Print Rnd
Debug.Print Rnd

'アプリケーション終了
(1回目)
0.7055475
0.533424
0.5795186
(2回目)
0.7055475
0.533424
0.5795186
同じ乱数を取得したい場合
Randomizeステートメントだけでは
初期化されない
(先にマイナス値を指定する必要がある)
Dim seed As Single
seed = Timer()

Rnd -1
Randomize seed
Debug.Print Rnd
Debug.Print Rnd
Debug.Print Rnd

'Rnd -1
Randomize seed
Debug.Print Rnd
Debug.Print Rnd
Debug.Print Rnd
0.1271544
0.3124266
0.9860412
0.0137049
0.8056682
0.6101372
正の数値であれば何を指定しても
次の乱数を取得する
Debug.Print Rnd(-1)
Debug.Print Rnd()
0.224007
3.584582E-02
Debug.Print Rnd(-1)
Debug.Print Rnd(1)
0.224007
3.584582E-02
Debug.Print Rnd(-1)
Debug.Print Rnd(123)
0.224007
3.584582E-02
Debug.Print Rnd(-1)
Debug.Print Rnd(1.23)
0.224007
3.584582E-02
小数を指定可能 Rnd(-1.23) 0.6677281
小数点以下が違う値を指定しても
異なる乱数を返す
Rnd(-1.23) 0.877298
Rnd(-1.234) 0.4759123
文字列の数値を指定可能 Rnd("-123") 0.8091505
文字列の数値(16進数)を指定可能 Rnd("&H123") 0.5640457
文字列の数値(8進数)を指定可能 Rnd("&O123") 0.5692797
文字列の数値(指数表記)を指定可能 Rnd("123E-2") 0.1286287
Nullを指定するとエラー Rnd(Null) エラー
Single型の最小値(-3.402823E38)を
下回るとエラー
Rnd(-3.402823E39) エラー
Single型の最大値(3.402823E38)を
上回るとエラー
Rnd(3.402823E39) エラー
Date型を指定しても乱数を返す
(しかしString型の場合はエラー)
Rnd(#2011/12/13#) 0.7576803
Rnd("2011/12/13") エラー


コメント
コメントする








    
この記事のトラックバックURL
トラックバック