私の疑似乱数
ACLS
PNLTYPE "OFF"
X=0:Y=0
FOR I=0 TO 9999
FOR J=0 TO 9999
GOSUB @RND:A=X*256:GOSUB @RND:B=X*256
GPAGE 0:GPSET A,B,15:GPAGE 1:GPSET A,B-192,15
NEXT
NEXT
END
@RND
Y=(Y+0.1)%1.1X=(X*117+Y)%1:RETURN
れいさんの疑似乱数(※X-Yが負数の場合が考慮されてないのでABSを付けました)
ACLS
PNLTYPE "OFF"
X=0:Y=0
FOR I=0 TO 9999
FOR J=0 TO 9999
GOSUB @RND:A=R*256:GOSUB @RND:B=R*256
GPAGE 0:GPSET A,B,15:GPAGE 1:GPSET A,B-192,15
NEXT
NEXT
END
下記に続く
うーん…
何処で見つけたのか、どう計算したのかわかりませんが、残念ながらそれだとアルゴリズムがダメなので最大周期が保証されてないんですよ
証明は…余白が足りないから省略。
X=0:Y=0
FOR I=0 TO 2000:FOR J=0 TO 9999
GOSUB @RND
IF X==0 AND Y==0 THEN GOTO @AAA
NEXT:NEXT
@AAA
PRINT STR$(I)+RIGHT$("000"+STR$(J),4)
こんな感じで試してみてくださいな
初期値が0,0なら4613119回で抜けてしまいます
それでもダメなんです…
確かに4096と1しか離れていない4095を使えば「互に素」ですから周期は伸びるんですが…
今度は近すぎて乱数じゃなくなっちゃう。
こちらを動かしてみてください。(たぶんmkIIで動く)
X=0:Y=0:DIM C[16]
FOR I=0 TO 10000
GOSUB @RND:X1=(X AND 3):GOSUB @RND:X1=(X AND 3)
J=X1+X2*4:C(J)=C(J)+1
NEXT
FOR I=0 TO 15
PRINT STR$(C(I))+"/";
NEXT
END
@RND
Y=(Y+1)%4095:X=(X*117+Y)%4096
RETURN