-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathrandom.fs
62 lines (52 loc) · 1.37 KB
/
random.fs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
\ XOR-Shift pseudo random number generator
\ (c) copyright 2015 by Gerald Wodni <[email protected]>
42137 variable seed
137 variable c-seed
\ xor-shift, http://www.arklyffe.com/main/2010/08/29/xorshift-pseudorandom-number-generator/
: random ( -- x )
seed @ \ get current seed
dup 13 lshift xor \ apply xor shift
dup 9 rshift xor
dup 7 lshift xor
dup seed ! ; \ store for next seed
\ 8-bit random generator
: c-random ( -- c )
c-seed @
dup 7 lshift xor
dup 5 rshift xor
dup 3 lshift xor
dup c-seed ! ;
\ generates matching bitmask for n
: match-bits ( u -- x )
0 begin
1 lshift 1 or \ add bit
swap 2/ swap \ right-shift input
over 0= \ input zero?
until nip ; \ drop input
\ random lower enclosing power of 2
: random-max2 ( u-max^2 -- u )
match-bits random and ;
\ random lower enclosing power of 2
: c-random-max2 ( u-max^2 -- u )
match-bits c-random and ;
\ random lower u-max
: random-max ( u-max -- u )
>r
begin
r@ random-max2 dup r@ >=
while
drop
repeat rdrop ;
\ random lower u-max
: c-random-max ( u-max -- u )
>r
begin
r@ c-random-max2 dup r@ >=
while
drop
repeat rdrop ;
: rand ( n -- )
0 do 17 c-random-max . cr loop ;
: random-xy ( -- x y )
cols c-random-max
rows c-random-max ;