commit 5b4ec0be6b7ca9740fa72d99cfa9d9392dd5d14d
parent f4e9e2e915d76d5ca8fc63284ab077e27347edf9
Author: Andrew Alderwick <andrew@alderwick.co.uk>
Date: Wed, 25 Aug 2021 21:59:30 +0100
Added a second PRNG with longer period
Diffstat:
1 file changed, 31 insertions(+), 12 deletions(-)
diff --git a/projects/examples/demos/prng.tal b/projects/examples/demos/prng.tal
@@ -1,7 +1,6 @@
-( pseudo-random number generator )
-
-( based on 16-bit xorshift algorithm discussed on
- http://www.retroprogramming.com/2017/07/xorshift-pseudorandom-numbers-in-z80.html )
+( pseudo-random number generator,
+ based on two 16-bit xorshift algorithms by George Marsaglia
+ http://www.jstatsoft.org/v08/i14/paper )
( devices )
@@ -18,17 +17,22 @@
|0100 ( -> )
( init )
;on-frame .Screen/vector DEO2
+
( seed prng (must be nonzero) )
- .DateTime/month DEI .DateTime/day DEI
- #00 .DateTime/second #a0 SFT2 EOR2
- #00 .DateTime/minute #40 SFT2 EOR2
- .DateTime/hour EOR
+ #00 .DateTime/second DEI
+ #00 .DateTime/minute DEI #60 SFT2 EOR2
+ #00 .DateTime/hour DEI #c0 SFT2 EOR2 ;prng2/x STA2
+ #00 .DateTime/hour DEI #04 SFT2
+ #00 .DateTime/day DEI #10 SFT2 EOR2
+ #00 .DateTime/month DEI #60 SFT2 EOR2
+ #00 .DateTime/year DEI #a0 SFT2 EOR2 ;prng2/y STA2
+ ;prng2/x LDA2 ;prng2/y LDA2 EOR2
ORAk ,&non-zero JCN INC2 &non-zero
;prng/seed STA2
( theme )
- #0fe5 .System/r DEO2
- #0fc5 .System/g DEO2
+ #0fe5 .System/r DEO2
+ #0fc5 .System/g DEO2
#0f25 .System/b DEO2
BRK
@@ -42,16 +46,17 @@
BRK
@draw-pixel
- ,prng JSR
+ ,prng2 JSR
#00 SWP .Screen/x DEO2
#00 SWP .Screen/y DEO2
#01 .Screen/pixel DEO
JMP2r
@prng ( -- number* )
- ( returns the next number in the 65,535-long sequence,
+ ( returns the next number in a 65,535-long sequence,
which is never zero but every other 16-bit number
appears once before the sequence repeats )
+ ( http://www.retroprogramming.com/2017/07/ xorshift-pseudorandom-numbers-in-z80.html )
,&seed LDR2
DUP2 #70 SFT2 EOR2
DUP2 #09 SFT2 EOR2
@@ -61,3 +66,17 @@
&seed $2
+@prng2 ( -- number* )
+ ( returns the next number in a (2^32-1)-long sequence )
+ ( http://b2d-f9r.blogspot.com/2010/08/ 16-bit-xorshift-rng-now-with-more.html )
+ ,&x LDR2
+ DUP2 #50 SFT2 EOR2
+ DUP2 #03 SFT2 EOR2
+ ,&y LDR2 DUP2 ,&x STR2
+ DUP2 #01 SFT2 EOR2 EOR2
+ ,&y STR2k POP
+ JMP2r
+
+ &x $2
+ &y $2
+