1 (* Written by Stephen
Weeks (sweeks@sweeks
.com
). *)
3 * Random number generator based on page
302 of Numerical Recipes
in C
.
7 fun natFold (start
, stop
, ac
, f
) =
12 else loop (i
+ 1, f (i
, ac
))
17 fun make (l
: word list
) =
18 let val a
= Array
.fromList l
19 in fn i
=> Array
.sub (a
, i
)
21 val c1
= make
[0wxbaa96887
, 0wx1e17d32c
, 0wx03bdcd3c
, 0wx0f33d1b2
]
22 val c2
= make
[0wx4b0f3b58
, 0wxe874f0c3
, 0wx6955c5a6
, 0wx55a7ca46
]
23 val half
: Word.word = 0w16
24 fun reverse w
= orb (>> (w
, half
), << (w
, half
))
25 fun psdes (lword
: word, irword
: word): word * word =
27 (0, niter
, (lword
, irword
), fn (i
, (lword
, irword
)) =>
29 val ia
= xorb (irword
, c1 i
)
30 val itmpl
= andb (ia
, 0wxffff
)
31 val itmph
= >> (ia
, half
)
32 val ib
= itmpl
* itmpl
+ notb (itmph
* itmph
)
34 xorb (lword
, itmpl
* itmph
+ xorb (c2 i
, reverse ib
)))
36 val zero
: word = 0wx13
37 val lword
: word ref
= ref
0w13
38 val irword
: word ref
= ref
0w14
44 val (l
, i
) = psdes (!lword
, !irword
)
47 val _
= needTo
:= false
59 else loop (Int.- (i
, 1), w
+ word())