Last Update : 2009/03/xx
乱数を発生させる関数です。関数名の由来は、「random number」から。
この命令を呼ぶと、HSPがランダムな整数値を提示してくれます。HSP2では命令形式のrnd命令として提供されてきましたが、HSP3では関数形式になりました。内部的にはC標準のrand関数を呼んでおり、「線形合同法」というアルゴリズムを使って擬似的に乱数を発生させてます。
rnd(数値)
第1パラメータに乱数発生範囲を指定します。指定できる数値は「1〜32768」です。たとえば、100を指定したならば、「0〜99」の範囲でバラバラな数値が返ります。
HSPの拡張プラグインHSPDA.dllには「メルセンヌ・ツイスタ」(Mersenne Twister)と言う高性能なアルゴリズムを採用した乱数発生命令も用意されてます。
rnd関数を利用したサンプルコードです。
// 乱数数値表示 button "クリック!", *jump stop *jump ; 乱数発生 mes rnd(100)
// 点の表示で四角形? pos 400, 100 button "クリック!", *jump stop *jump ; 色 color rnd(256), rnd(256), rnd(256) redraw 0 repeat 1000 ; 点を描画 pset rnd(250) + 50, rnd(200) + 50 loop redraw 1
rnd関数を呼ぶと、一定のパターンで乱数が発生します。一番最初のサンプルをコンパイル実行して、同じサンプルを別にコンパイル実行してみてください。必ず同じ数値のパターンで表示されていくと思います。パターンを不定にする(発生系列の初期化)には、パラメータなしのrandomize命令を一度だけ宣言しておきます。
// 乱数数値表示 randomize button "クリック!", *jump stop *jump ; 乱数発生 mes rnd(6) + 1
全く何か目的がない限りrandomize命令を何度も呼ぶような処理にしないでください。randomize命令が呼ばれるたびに乱数発生パターンが初期化されるので、無駄に呼ぶと逆に乱数が発生しなくなる場合があります。
出現した数値を2度と出さない乱数発生です。HSP2掲示板(No. 608)で大分前にchokkoさんが提示されたものです。
#define MAX 10 randomize dim kekka, MAX repeat MAX value = rnd(cnt + 1) kekka.cnt = kekka.value kekka.value = cnt loop repeat MAX mes kekka.cnt loop