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 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
|
//usr/bin/env myatscc "$0"; exit
(* ****** ****** *)
(*
**
** Linear random number generator
**
*)
(* ****** ****** *)
//
// How to test:
// ./randerlin
// valgrind ./randerlin
//
// How to compile:
// patscc -DATS_MEMALLOC_LIBC -o randerlin randerlin.dats
//
(* ****** ****** *)
//
(*
##myatsccdef=\
patsopt --constraint-ignore --dynamic $1 | \
tcc -run -DATS_MEMALLOC_LIBC -I${PATSHOME} -I${PATSHOME}/ccomp/runtime -
*)
//
(* ****** ****** *)
//
#include
"share/atspre_staload.hats"
//
(* ****** ****** *)
vtypedef
randerlin = streamer_vt (ulint)
(* ****** ****** *)
extern
fun randerlin_make (): randerlin
(* ****** ****** *)
implement
randerlin_make () = let
//
fun aux
(
state: ulint
) : stream_vt (ulint) = $ldelay
(
//
let
//
val state =
(state * 196314165UL) + 907633515UL
//
in
stream_vt_cons (state, aux (state))
end
//
) (* end of [$ldelay] *) // end of [val]
//
in
streamer_vt_make (aux (31435926536UL(*init*)))
end // end of [randerlin_make]
(* ****** ****** *)
implement
main0 () =
{
//
val r0 = randerlin_make ()
//
val () = println! ("randerlin(r0) = ", r0[])
val () = println! ("randerlin(r0) = ", r0[])
val () = println! ("randerlin(r0) = ", r0[])
//
val () = ~r0 // freeing the random number generator
//
} (* end of [main0] *)
(* ****** ****** *)
(* end of [randerlin.dats] *)
|