diff --git a/src/FSharp/Random.fs b/src/FSharp/Random.fs index 6b802b4c..da2c6f01 100644 --- a/src/FSharp/Random.fs +++ b/src/FSharp/Random.fs @@ -35,56 +35,78 @@ module Random = /// Returns the default mersenne twister, thread-safe and also thread-locally shared let shared = MersenneTwister.Default :> System.Random + let samples length = MersenneTwister.Samples(length, RandomSeed.Guid()) + let sampleSeq () = MersenneTwister.SampleSequence(RandomSeed.Guid()) /// Creates a default .Net system pRNG with a custom seed based on uinque GUIDs let system () = new SystemRandomSource() :> System.Random let systemSeed (seed:int) = new SystemRandomSource(seed) :> System.Random + let systemSamples (seed:int) length = SystemRandomSource.Samples(length, seed) + let systemSampleSeq (seed:int) = SystemRandomSource.SampleSequence(seed) #if PORTABLE #else /// Creates a default .Net cryptographic system pRNG let crypto () = new CryptoRandomSource() :> System.Random let cryptoWith (threadSafe:bool) = new CryptoRandomSource(threadSafe) :> System.Random + let cryptoSamples length = CryptoRandomSource.Samples(length) + let cryptoSampleSeq () = CryptoRandomSource.SampleSequence() #endif /// Creates a Mersenne Twister 19937 pRNG with a custom seed based on uinque GUIDs let mersenneTwister () = new MersenneTwister() :> System.Random let mersenneTwisterSeed (seed:int) = new MersenneTwister(seed) :> System.Random let mersenneTwisterWith seed threadSafe = new MersenneTwister(seed, threadSafe) :> System.Random + let mersenneTwisterSamples (seed:int) length = MersenneTwister.Samples(length, seed) + let mersenneTwisterSampleSeq (seed:int) = MersenneTwister.SampleSequence(seed) /// Creates a multiply-with-carry Xorshift (Xn = a * Xn−3 + c mod 2^32) pRNG with a custom seed based on uinque GUIDs let xorshift () = new Xorshift() :> System.Random let xorshiftSeed (seed:int) = new Xorshift(seed) :> System.Random let xorshiftWith seed threadSafe = new Xorshift(seed, threadSafe) :> System.Random let xorshiftCustom seed threadSafe a c x1 x2 = new Xorshift(seed, threadSafe, a, c, x1, x2) :> System.Random + let xorshiftSamples (seed:int) length = Xorshift.Samples(length, seed) + let xorshiftSampleSeq (seed:int) = Xorshift.SampleSequence(seed) /// Creates a Wichmann-Hill’s 1982 combined multiplicative congruential pRNG with a custom seed based on uinque GUIDs let wh1982 () = new WH1982() :> System.Random let wh1982Seed (seed:int) = new WH1982(seed) :> System.Random let wh1982With seed threadSafe = new WH1982(seed, threadSafe) :> System.Random + let wh1982Samples (seed:int) length = WH1982.Samples(length, seed) + let wh1982SampleSeq (seed:int) = WH1982.SampleSequence(seed) /// Creates a Wichmann-Hill’s 2006 combined multiplicative congruential pRNG with a custom seed based on uinque GUIDs let wh2006 () = new WH2006() :> System.Random let wh2006Seed (seed:int) = new WH2006(seed) :> System.Random let wh2006With seed threadSafe = new WH2006(seed, threadSafe) :> System.Random + let wh2006Samples (seed:int) length = WH2006.Samples(length, seed) + let wh2006SampleSeq (seed:int) = WH2006.SampleSequence(seed) /// Creates a Parallel Additive Lagged Fibonacci pRNG with a custom seed based on uinque GUIDs let palf () = new Palf() :> System.Random let palfSeed (seed:int) = new Palf(seed) :> System.Random let palfWith seed threadSafe = new Palf(seed, threadSafe, 418, 1279) :> System.Random let palfCustom seed threadSafe shortLag longLag = new Palf(seed, threadSafe, shortLag, longLag) :> System.Random + let palfSamples (seed:int) length = Palf.Samples(length, seed) + let palfSampleSeq (seed:int) = Palf.SampleSequence(seed) /// Creates a Multiplicative congruential generator using a modulus of 2^59 and a multiplier of 13^13 pRNG with a custom seed based on uinque GUIDs let mcg59 () = new Mcg59() :> System.Random let mcg59Seed (seed:int) = new Mcg59(seed) :> System.Random let mcg59With seed threadSafe = new Mcg59(seed, threadSafe) :> System.Random + let mcg59Samples (seed:int) length = Mcg59.Samples(length, seed) + let mcg59SampleSeq (seed:int) = Mcg59.SampleSequence(seed) /// Creates a Multiplicative congruential generator using a modulus of 2^31-1 and a multiplier of 1132489760 pRNG with a custom seed based on uinque GUIDs let mcg31m1 () = new Mcg31m1() :> System.Random let mcg31m1Seed (seed:int) = new Mcg31m1(seed) :> System.Random let mcg31m1With seed threadSafe = new Mcg31m1(seed, threadSafe) :> System.Random + let mcg31m1Samples (seed:int) length = Mcg31m1.Samples(length, seed) + let mcg31m1SampleSeq (seed:int) = Mcg31m1.SampleSequence(seed) /// Creates a 32-bit combined multiple recursive generator with 2 components of order 3 pRNG with a custom seed based on uinque GUIDs let mrg32k3a () = new Mrg32k3a() :> System.Random let mrg32k3aSeed (seed:int) = new Mrg32k3a(seed) :> System.Random let mrg32k3aWith seed threadSafe = new Mrg32k3a(seed, threadSafe) :> System.Random + let mrg32k3aSamples (seed:int) length = Mrg32k3a.Samples(length, seed) + let mrg32k3aSampleSeq (seed:int) = Mrg32k3a.SampleSequence(seed)