【プチコン/mkII 両対応】
プチコンには標準でRND関数が備わっておりこれによってA=RND (10)で0〜9の乱数を発生させることが可能になっています。普通に使う場合には全く問題ないのですがゲームなどで使用する場合には同じ乱数列の乱数を発生させることができないという問題になることがあります。それは、ゲーム内で同じものを再現ができないということです。
ACLS X=0 FOR I=1 TO 64 GOSUB @RND ? X; NEXT END @RND X=(X*3+2)%64 RETURN |
ACLS X=0 FOR I=1 TO 64 GOSUB @RND:A=X GOSUB @RND:B=X GPSET A,B,15 NEXT END @RND X=(X*3+2)%64 RETURN |
《 線形合同法の問題点 》 (1) 上位の桁はランダム性が高く下位の桁はランダム性が低い (2) いくつか組にして使えばランダムではなくなる |
ACLS FOR I=1 TO 524287 GPSET RND(256),RND(192),15 NEXT |
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 X=(X*5+3)%65536 RETURN |
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+1)%65535 X=(X*5+Y)%65536 RETURN |
ACLS PNLTYPE "OFF" X=0:Y=0 FOR I=0 TO 9999 FOR J=0 TO 9999 GOSUB @RND:A=X/16 GOSUB @RND:B=X/16 GPAGE 0:GPSET A,B,15 GPAGE 1:GPSET A,B-192,15 NEXT NEXT END @RND Y=(Y+1)%4095 X=(X*117+Y)%4096 RETURN |
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+1)%4095 X=(X*479232+Y)%4096/4096 RETURN |
(1)使いやすい (2)上位ビットが優先して使用される |
C=0:X=0:Y=0 FOR I=1 TO 100000 GOSUB @RND A=X GOSUB @RND B=X IF A*A+B*B<1 THEN C=C+1 NEXT ? C*4/100000 END @RND Y=(Y+1)%4095 X=(X*479232+Y)%4096/4096 RETURN |