Rnd関数は0以上1未満の乱数を生成します。これを利用すれば簡単な占いプログラムや、スロットゲームのようなものを作ることができます。今回はこのRnd関数の使用方法とその処理のときに忘れがちなポイント、注意点をご紹介します。
Rnd関数の確認
前述の通り、Rnd関数は0以上1未満の乱数を生成することができます。まずはこの関数の動きを簡単に確認してみましょう。
1 2 3 4 5 6 7 8 9 |
Public Sub ransu() Range("A1").Value = Rnd() Range("A2").Value = Rnd() Range("A3").Value = Rnd() End Sub |
【実行結果】
実行結果のように値は実行されるたびに異なります。実際はこのような値はプログラムを作成する上で使いづらいため、何かしらの計算処理と型変換の処理を記述し、扱いやすい値へ修正します。
引数の指定
上記のプログラムでは実行するたびに異なる乱数が発生しましたが、引数を指定して任意の順番で乱数を生成することも可能です。
引数には数値が入り、正の値を渡せば次の乱数の値を返すことができます。引数を省略した場合も同じです。反対に負の値を渡すと決められた順番で生成することが可能です。また、引数に0を渡した場合は直前の乱数の値と同じ値を生成することが可能になります。
<引数に負の値を渡したとき>
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Public Sub ransu2() Dim i As Integer Rnd (-2) For i = 1 To 5 Debug.Print "i=" & i & ":" & Rnd Next i End Sub |
【実行結果】
※わかりやすいように実行は2度行っています。
<引数に0を渡したとき>
1 2 3 4 5 6 7 8 9 10 11 |
Public Sub ransu3() Dim i As Integer For i = 1 To 5 Debug.Print Rnd(0) Next i End Sub |
【実行結果】
Randomizeによる初期化
乱数の生成の際は必ずといっていいほどRandomizeステートメントを用います。これは乱数の初期化をするために必要になります。なぜ必要かというと、乱数が生成される仕組みとして乱数系列を司るシード値というものを基に生成しているからです。Randomizeを記述しないとそのシード値が変わらない状態になってしまいます。Excelのブックを閉じて開きなおして再度マクロを実行したとしても、前回の生成結果と同じ結果になります。なので意図して行わない以上はRandomizeを用いて乱数系列の初期化をしましょう。
※A列がブックを閉じて再度開いた後の実行時の結果、C列が前回の実行結果です。
型変換時の注意
乱数で0~9までの値を扱いたい場合があります。このような時は、Rndで生成した値に10をかける処理を加えると実現できますが、その際、小数値を除外するためにInteger型の変数への格納と、型変換も必要になってきます。注意するのは型変換のときに用いられるInt関数とCInt関数の違いです。両方ともIntegerに型変換することが可能ですが、前者と後者で用法と使いどころが異なります。乱数と共に用いた場合に限った違いをまとめてみました。
Int関数(主に小数値を整数値に変換するとき)
・・・小数部分を切り捨てる性質があります。0.5なら0、1.5なら1となります。
CInt関数(主に文字列の数字から数値に変換するとき)
・・・変換の際、常に最も近い偶数へ値を丸め込む性質があります。0.5なら0、1.5なら2となります。
一般的にはInt関数で変換します。CInt関数でも変換自体は可能ですが、性質的に使いにくいでしょう。
まとめ
以上のようにRnd関数はVBAの様々な開発で用いられます。使う際は決まりごとや使いどころが多く難しいので、よく性質を理解して実装していきましょう。また、サイコロプログラムのように簡単なロジックのサンプルコードはたくさんの参考サイトがありますので、簡単に作成し試すことができると思いますので是非やってみましょう。