〜 ナンバー 〜
32769種類以上の乱数発生

標準で乱数を取得できるのはrnd命令(関数)しかありませんが、
取得できるのは最大32768種までとなっているため、32769種以上取得したい場合は、
rnd命令(関数)の結果を加算した合計を乱数とする必要があります。
しかし、単純に合計する方法は、乱数範囲が広がれば広がるほど平均値が取得されます。
1回の乱数取得だと、最小値〜最大値までのどんな数もランダムで取得されますが、
複数回組み合わせる場合、複数回取得するうちの1回にたまたま極小値や極大値を取得しても、
合計値に加算していくと、最終的に中間点付近となる平均的な値で終わってしまうのです。
その為、複数回実行した合計値を乱数とする場合は、少し手を加える必要があります。
例えば複数回取得する必要がある場合は、サンプルのように何回取得するかをランダムにするのです。
こうすることで、最小値近辺の極小値を取得できる確率も単純に合計するだけより増すことでしょう。
乱数でマイナス値を取得したり、巨大な乱数であっても32768種以下に収まり、
範囲を拡大する必要がない場合は、コチラを参照してください。
	

wrnd 受取先変数, 範囲
受取先変数取得した乱数の格納先変数を指定する。
範囲取得範囲の上限値+1を指定する。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
#module
#deffunc wrnd val, int
	mref value, 16 : mref rmax, 1
	value = 0
	rnd r, (rmax - 1) / 32768
	repeat r + 1
		if (rmax - 1) / 32768 = cnt : rnd r, rmax \ 32768 : else : rnd r, 32768
		value += r
	loop
	return
#global

	randomize
	repeat 100
		wrnd tmp, 35000
		pos cnt \ 10 * 60 + 10, cnt / 10 * 30 + 10 : mes tmp
	loop
	stop

結果 = wrnd(範囲)
結果生成したランダム値の格納先を指定する。
範囲取得範囲の上限値+1を指定する。(rnd関数と同じ)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
#module
#defcfunc wrnd int rmax, local r
	repeat rnd((rmax - 1) / 32768) + 1
		if cnt = (rmax - 1) / 32768 : r += rnd(rmax \ 32768) : else : r += rnd(32768)
	loop
	return r
#global

	randomize
	repeat 100
		pos cnt \ 10 * 60 + 10, cnt / 10 * 30 + 10 : mes wrnd(35000)
	loop