VisualBasic(脳トレ的アプリ004: Randomize)

■問題作成部分のコーディングの推敲中。
問題の選択肢を作成する際に、無限ループに陥ったと思われるときがあったけど、何度か繰り返すと同じにようになる頻度がやけに高い。プログラム上は、Rnd()でランダムな数値を呼び出しているはずなので、何度か繰り返せば無限ループに陥らずに動作し続ける時もありそうだけど、どうもそうならない。少し調べてみると、Rnd()は乱数を呼び出すけど、Rnd()を呼び出した時点で乱数を作るのではなく、すでに決まっている一連の数を都度取り出しているだけらしい。

下のコードで少し試してみた。

Shared Function randomSample()
    For i = 1 To 10
        Console.WriteLine(Int((9 * Rnd()) + 1))
    Next
End Function

このコードを実行すると、1から9までのランダムの10個の数がコンソールに表示される。

プログラムを終了させ、再度実行させると全く同じ数が出てくる。このため、初めに無限ループになるような組み合わせとなっていた場合、何度プログラムを終了、実行させても無限ループに陥ってしまう。

これを解消させるために、Randomize()を入れればいいみたい。MicrosoftのDocumentationでは、 Randomize()は乱数ジェネレーターを初期化するものとある。
上のコードに、さらに10個の数を表示するコードとRandomize()を追加してみる。

Shared Function randomSample()
        For i = 1 To 10
            Console.WriteLine(Int((9 * Rnd()) + 1))
        Next
        Console.WriteLine("======")
        Randomize()
        For i = 1 To 10
            Console.WriteLine(Int((9 * Rnd()) + 1))
        Next
End Function

下の図で左(上)が10個の数を表示するコードのみ追加した場合。右(下)がさらにRandomize()を追加した場合。
実行は、左から右で行っているので、左は一番上のコードと同じランダムパターンの1~20番目の数が表示され、右は、途中でRandomize()で初期化しているので、一番上のコードと同じランダムパターンの1~10番目と初期化された新しいランダムパターンの1~10番目の数が表示されている。

ランダムを作るとき、普通はRndといったランダムを生成するメソッドのよびだし毎に乱数が作られるものかと思ったけど、Visual basicの場合、乱数の一連の組み合わせができており、それをRndで呼び出すといった仕様のよう。そのため、コードの中で適宜Randomize()を入れて初期化する必要がある。