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
疑似乱数を使いたい時にどうぞ。
やっぱりさ、疑似乱数は初期化したいよね?