random
Pseudo-random number generation
| LTS Haskell 24.18: | 1.2.1.3 | 
| Stackage Nightly 2025-11-04: | 1.3.1 | 
| Latest on Hackage: | 1.3.1 | 
random-1.3.1@sha256:0b4f649c3e78713b2ccad1535251ee34b148237fb2229d7058c2b1d9ccc324b8,6004Module documentation for 1.3.1
- System
- System.Random
- System.Random.Internal
 - System.Random.Stateful
 
 
 - System.Random
 
The Haskell Standard Library
Random Number Generation
Status
| Language | Github Actions | Coveralls | 
|---|---|---|
| Github Repo | Hackage | Nightly | LTS | 
|---|---|---|---|
random | 
Description
This library provides a basic interface for (splittable) pseudo-random number generators.
The API documentation can be found here:
http://hackage.haskell.org/package/random/docs/System-Random.html
An older version of this library is included with GHC in
the haskell98 package. This newer version is included in the Haskell
Platform.
Please report bugs in the GitHub issue tracker (no longer in the GHC trac).
Changes
1.3.1
- Add missing 
SplitGeninstance forStateGen: #183 
1.3.0
- Improve floating point value generation and avoid degenerate cases: #172
 - Add 
Uniforminstance forMaybeandEither: #167 - Add 
Seed,SeedGen,seedSize,seedSizeProxy,mkSeedandunSeed: #162 - Add 
mkSeedFromByteString,unSeedToByteString,withSeed,withSeedM,withSeedFile,seedGenTypeName,nonEmptyToSeed,nonEmptyFromSeed,withSeedM,withSeedMutableGenandwithSeedMutableGen_ - Add 
SplitGenandsplitGen: #160 - Add 
unifromShuffleListandunifromShuffleListM: #140 - Add 
uniformWordR: #140 - Add 
mkStdGen64: #155 - Add 
uniformListRM,uniformList,uniformListR,uniformsanduniformRs: #154 - Add compatibility with recently added 
ByteArraytobase: #153- Switch to using 
ByteArrayfor type class implementation instead ofShortByteString - Add 
unsafeUniformFillMutableByteArraytoRandomGenand a helper functiondefaultUnsafeUniformFillMutableByteArraythat makes implementation for most instances easier. - Add 
uniformByteArray,uniformByteStringanduniformFillMutableByteArray - Deprecate 
genByteStringin favor ofuniformByteString - Add 
uniformByteArrayMtoStatefulGen - Add 
uniformByteStringManduniformShortByteStringM - Deprecate 
System.Random.Stateful.uniformShortByteStringin favor ofuniformShortByteStringMfor consistent naming and a future plan of removing it fromStatefulGentype class - Add a pure 
System.Random.uniformShortByteStringgenerating function. - Deprecate 
genShortByteStringin favor ofSystem.Random.uniformShortByteString - Expose a helper function 
fillByteArrayST, that can be used for defining implementation foruniformByteArrayM - Deprecate 
genShortByteStringSTandgenShortByteStringIOin favor offillByteArrayST 
 - Switch to using 
 - Improve 
FrozenGeninterface: #149- Move 
thawGenfromFreezeGeninto the newThawGentype class. Fixes an issue with an unlawful instance ofStateGenforFreezeGen. - Add 
modifyGenandoverwriteGento theFrozenGentype class - Switch 
splitGenMto useSplitGenandFrozenGeninstead of deprecatedRandomGenM - Add 
splitMutableGenM - Switch 
randomMandrandomRMto useFrozenGeninstead ofRandomGenM - Deprecate 
RandomGenMin favor of a more powerfulFrozenGen 
 - Move 
 - Add 
isInRangeOrdandisInRangeEnumthat can be used for implementingisInRange: #148 - Add 
isInRangetoUniformRange: #78 - Add default implementation for 
uniformRMusingGenerics: #92 
1.2.1
- Fix support for ghc-9.2 #99
 - Fix performance regression for ghc-9.0 #101
 - Add 
uniformEnumManduniformEnumRM - Add 
initStdGen#103 - Add 
globalStdGen#117 - Add 
runStateGenST_ - Ensure that default implementation of 
ShortByteStringgeneration uses unpinned memory. #116 - Fix #54 with
#68 - if exactly one value in the
range of floating point is infinite, then 
uniformRM/randomRreturns that value. - Add default implementation of 
uniformMthat usesGeneric#70 Randominstance forCBool#77- Addition of 
TGenandTGenM#95 - Addition of tuple instances for 
Randomup to 7-tuple #72 
1.2.0
- Breaking change which mostly maintains backwards compatibility, see “Breaking Changes” below.
 - Support for monadic generators e.g. mwc-random.
 - Monadic adapters for pure generators (providing a uniform monadic interface to pure and monadic generators).
 - Faster in all cases except one by more than x18 (N.B. x18 not 18%) and some cases (depending on the type) faster by more than x1000 - see below for benchmarks.
 - Passes a large number of random number test suites:
- dieharder
 - TestU01 (SmallCrush, Crush, BigCrush)
 - PractRand
 - gjrand
 - See random-quality for details on how to do this yourself.
 
 - Better quality split as judged by these tests. Again see random-quality for details on how to do this yourself.
 - Unbiased generation of ranges.
 - Updated tests and benchmarks.
 - Continuous integration.
 
Breaking Changes
Version 1.2.0 introduces these breaking changes:
- requires 
base >= 4.8(GHC-7.10) StdGenis no longer an instance ofReadrandomIOandrandomRIOwere extracted from theRandomclass into separate functions
In addition, there may be import clashes with new functions, e.g. uniform and
uniformR.
Deprecations
Version 1.2.0 introduces genWord64, genWord32 and similar methods to the
RandomGen class. The significantly slower method next and its companion
genRange are now deprecated.
Issues Addressed
| Issue Number | Description | Comment | 
|---|---|---|
| 25 | The seeds generated by split are not independent | Fixed: changed algorithm to SplitMix, which provides a robust split operation | 
| 26 | Add Random instances for tuples | Addressed: added Uniform instances for up to 6-tuples | 
| 44 | Add Random instance for Natural | Addressed: added UniformRange instance for Natural | 
| 51 | Very low throughput | Fixed: see benchmarks below | 
| 53 | incorrect distribution of randomR for floating-point numbers | (*) | 
| 55 | System/Random.hs:43:1: warning: [-Wtabs] | Fixed: No more tabs | 
| 58 | Why does random for Float and Double produce exactly 24 or 53 bits? | (*) | 
| 59 | read :: StdGen fails for strings longer than 6 | Addressed: StdGen is no longer an instance of Read | 
Comments
(*) 1.2 samples more bits but does not sample every Float or
Double. There are methods to do this but they have some downsides;
see here for a
fuller discussion.
Benchmarks
Here are some benchmarks run on a 3.1 GHz Intel Core i7. The full
benchmarks can be run using e.g. stack bench. The benchmarks are
measured in milliseconds per 100,000 generations. In some cases, the
performance is over x1000 times better; the minimum performance
increase for the types listed below is more than x36.
| Name | 1.1 Mean | 1.2 Mean | 
|---|---|---|
| Float | 27.819 | 0.305 | 
| Double | 50.644 | 0.328 | 
| Integer | 42.332 | 0.332 | 
| Word | 40.739 | 0.027 | 
| Int | 43.847 | 0.028 | 
| Char | 17.009 | 0.462 | 
| Bool | 17.542 | 0.027 | 
1.1
- breaking change to 
randomIValIntegerto improve RNG quality and performance see https://github.com/haskell/random/pull/4 and ghc https://ghc.haskell.org/trac/ghc/ticket/8898 - correct documentation about generated range of Int32 sized values of type Int https://github.com/haskell/random/pull/7
 - fix memory leaks by using strict fields and strict atomicModifyIORef’ https://github.com/haskell/random/pull/8 related to ghc trac tickets #7936 and #4218
 - support for base < 4.6 (which doesnt provide strict atomicModifyIORef’) and integrating Travis CI support. https://github.com/haskell/random/pull/12
 - fix C type in test suite https://github.com/haskell/random/pull/9
 
1.0.1.1
bump for overflow bug fixes
1.0.1.2
bump for ticket 8704, build fusion
1.0.1.0
bump for bug fixes,
1.0.0.4
bumped version for float/double range bugfix