予測不可能
「おみくじを作ってみよう」と、なった場合どういう風に作りますか?
今まで使ってきた命令だけで表示させるだけの例を示してみましょう。
sdim omikuji, 10, 6
omikuji = "大吉", "中吉", "末吉", "吉", "凶", "大凶"
button "占う", *kuji
stop
*kuji
gettime time, 7
time = time \ 6
mes omikuji.time
stop
現在のミリ秒を取得して、取得したミリ秒を6で割った余りを利用すれば、
ボタンを押した時の時間によって自動的に振り分けることができるようになりますが、
最大1000種類しか生成できません。
秒や分などと組み合わせればもっとパターン数を増やすことができますが、
過ぎ去った時間のパターンは、パターンを1周するまで現れることがなくなりますし、
パターンの最後のほうに設定したものは出現するまでに時間が掛かってしまいます。
こういう場合に有効なのが予測不可能な数値生成する命令「rnd」です。
rnd命令を使えば毎回パターンの変わるモノに対応させられます。
書式は「rnd 数値を入れる変数,乱数最大値」です。
p1の変数には、生成された乱数が代入されます。
p2の最大値には1〜32768の間の数値を指定します。
省略はできず、32768以上を指定しても32768になります。
実際にp1に入る値は0〜(p2で指定した値−1)です。例えばp2を5にすると0〜4の値のどれかが入ります。
尚、32769以上の値を指定したい場合はTIPSにあるサンプルを参考にしてみてください。
sdim omikuji, 10, 6
omikuji = "大吉", "中吉", "末吉", "吉", "凶", "大凶"
button "占う", *kuji
stop
*kuji
rnd a, 6 ;変数aに0〜5のどれかが入る
mes omikuji.a
stop
これでランダムなおみくじが完成しましたね。実行してみると確かにランダムです。
…が、そのウィンドウを終了させて再度占ってみると…?
ランダムかと思いきや、さっきとまったく同じ結果が出ていると思われます。
実はrndだけでは完全な乱数は生成できず、擬似乱数というものが生成されるのです。
repeat 20
rnd randamu, 30
mes randamu ; 生成された擬似乱数を表示
loop
stop
一見ランダムに思える数値は実は初めから決められている数値なのです。
ではどうすればよいか?
ココで出てくるのがrnd命令のパターンを初期化するrandomize命令です。
書式は「randomize 初期化パラメーター」ですが、
このp1に値を指定すると、その値を元にした擬似乱数が生成されます。
省略すればWindowsのタイマから得られた不定な値を使って初期化しますので、完全に予測は不可能です。
下記のスクリプトを何回か実行して試してください。
randomize ; 初期パラメーターを不定にする(一回実行するだけでよい)
repeat 20
rnd randamu, 30
mes randamu
loop
stop
コレを利用して、足し算ができるスクリプトを書いてみます。
randomize
objsize 100, 25
button "問題", *mondai
button "回答完了", *anser
pos 160, 75 : input ans,80, 25, 5 ; 変数ansにはユーザーの答えが入る
stop
*mondai
color 255, 255, 255 ; 白色に変更
boxf ; 文字を消すため背景色で塗りつぶす
color 0,0,0 ; 文字色黒色に戻しておく
rnd left, 32768 ; 0〜32767の数値を生成
rnd right, 32768 ; 0〜32767の数値をもう1つ生成
pos 30, 80 : mes "" + left + " + " + right + " = "
stop
*anser
kotae = left + right ; 本当の答えを出しておく
pos 50, 120 : mes "答えは" + kotae + "です" ; 本当の答えを表示
if kotae = ans : pos 50, 140 : mes "正解です。おみごと!" ; 正解なら正解メッセージを表示
stop
さぁすべて理解できますか?
今までに習ったものしか使っていないので、分からないところは見直してください。