Home My Page Projects Code Snippets Project Openings SML/NJ
 Summary Activity Forums Tracker Lists Tasks Docs Surveys News SCM Files

# SCM Repository

[smlnj] View of /sml/branches/SMLNJ/src/smlnj-lib/Util/OLDrand.sml
 [smlnj] / sml / branches / SMLNJ / src / smlnj-lib / Util / OLDrand.sml

# View of /sml/branches/SMLNJ/src/smlnj-lib/Util/OLDrand.sml

Thu Mar 12 01:05:57 1998 UTC (22 years, 8 months ago)
File size: 1376 byte(s)
`This commit was manufactured by cvs2svn to create branch 'SMLNJ'.`
```(* rand.sml
*
* COPYRIGHT (c) 1991 by AT&T Bell Laboratories.  See COPYRIGHT file for details
*
* Random number generator taken from Paulson, pp. 170-171.
* Recommended by Stephen K. Park and Keith W. Miller,
* Random number generators: good ones are hard to find,
* CACM 31 (1988), 1192-1201
* Updated to include the new preferred multiplier of 48271
* CACM 36 (1993), 105-110
*
* Note: The Random structure provides a better generator.
*)

structure Rand : RAND =
struct

(* real number version for systems with 46-bit mantissas *)
val a = 48271.0  and  m = 2147483647.0

val randMin = 1.0
val randMax = m - 1.0

fun random seed = let
val t = a*seed
in
t - m * real(floor(t/m))
end

fun mkRandom seed = let
val seed = ref seed
in
fn () => (seed := random (!seed); !seed)
end

fun norm r = r / m

fun range (i,j) =
if j < i
then LibBase.failure{module="Random",func="range",msg="hi < lo"}
else let
val R = real(j - i + 1)
in
fn r => i + floor(R*(r/m))
end handle _ => let
val ri = real i
val R = (real j)-ri+1.0
in
fn r => floor(ri + R*(r/m))
end

end (* Rand *)

```