UWSCで疑似乱数(XorShift)

UWSCには、RANDOM関数はあるが初期化できない。
ということで、XorShiftを実装してみた。
UWSCにはシフト演算がないため、あまり早くないだろうけど)



スクリプト

OPTION EXPLICIT

IFB GET_UWSC_NAME = "XorShift.uws" THEN
	DIM i
	FOR i = 1 TO 100
		PRINT XorShift.Next()
	NEXT
ENDIF


MODULE XorShift
	DIM x, y, z, w, k11, k21, k19, k8

	PROCEDURE XorShift
		k11 = POWER(2, 11)
		k21 = POWER(2, 21)
		k19 = POWER(2, 19)
		k8 = POWER(2, 8)
		Init(88675123, 0)
	FEND

	PROCEDURE Init(seed, n=40, ix=123456789, iy=362436069, iz=521288629)
		// seedの有効範囲が19ビット以上なら4回以上、11ビット以上なら10回以上スキップしたいところ
		// 40回とかスキップすると充分安全、、、らしい
		x = ix
		y = iy
		z = iz
		w = seed
		DIM i
		FOR i = 1 TO n
			Next()
		NEXT
	FEND

	FUNCTION Next(m=0)
		DIM t = x XOR ((x MOD k21) * k11)
		x=y; y=z; z=w
		w = ( (w XOR INT(w/k19)) XOR (t XOR INT(t/k8)) )
		RESULT = w
		IF m THEN RESULT = w MOD m
	FEND
ENDMODULE

疑似乱数を使いたい時にどうぞ。


やっぱりさ、疑似乱数は初期化したいよね?