End-of-life notification
This library was designed to bring alternative generators to the NumPy infrastructure. It as been successful in advancing the conversation for a future implementation of a new random number API in NumPy which will allow new algorithms and/or generators. The next step in this process is to separate the basic (or core RNG) from the functions that transform random bits into useful random numbers. This has been implemented in a successor project randomgen available on GitHub or PyPi.
randomgen has a slightly different API, so please see the randomgen documentation.
This is a library and generic interface for alternative random generators in Python and NumPy.
# import numpy.random as rnd
import randomstate as rnd
x = rnd.standard_normal(100)
y = rnd.random_sample(100)
z = rnd.randn(10,10)
import randomstate as rnd
w = rnd.standard_normal(10000, method='zig')
x = rnd.standard_exponential(10000, method='zig')
y = rnd.standard_gamma(5.5, 10000, method='zig')
Support for 32-bit floating randoms for core generators. Currently supported:
random_sample
)standard_exponential
, both Inverse CDF and Ziggurat)standard_normal
, both Box-Muller and Ziggurat)standard_gamma
, both Inverse CDF and Ziggurat)WARNING: The 32-bit generators are experimental and subject to change.
Note: There are no plans to extend the alternative precision generation to all random number types.
Support for filling existing arrays using out
keyword argument. Currently
supported in (both 32- and 64-bit outputs)
random_sample
)standard_exponential
)standard_normal
)standard_gamma
)This modules includes a number of alternative random number generators in addition to the MT19937 that is included in NumPy. The RNGs include:
numpy.random.RandomState
standard_normal
, normal
, randn
and multivariate_normal
all
support an additional method
keyword argument which can be bm
or
zig
where bm
corresponds to the current method using the Box-Muller
transformation and zig
uses the much faster (100%+) Ziggurat method.standard_exponential
and standard_gamma
both support an additional
method
keyword argument which can be inv
or
zig
where inv
corresponds to the current method using the inverse
CDF and zig
uses the much faster (100%+) Ziggurat method.np.float32
) or double precision (np.float64
, the default) using
an the optional keyword argument dtype
out
keyword argumentrandom_entropy
- Read from the system entropy provider, which is
commonly used in cryptographic applicationsrandom_raw
- Direct access to the values produced by the underlying
PRNG. The range of the values returned depends on the specifics of the
PRNG implementation.random_uintegers
- unsigned integers, either 32- ([0, 2**32-1]
)
or 64-bit ([0, 2**64-1]
)jump
- Jumps RNGs that support it. jump
moves the state a great
distance. Only available if supported by the RNG.advance
- Advanced the core RNG 'as-if' a number of draws were made,
without actually drawing the numbers. Only available if supported by
the RNG.numpy.random.RandomState
. The
mt19937
generator is identical to numpy.random.RandomState
, and
will produce an identical sequence of random numbers for a given seed. The version matched the latest version of NumPy where
randomstate.prng.mt19937
passes all NumPy test.
An occasionally updated build of the documentation is available on my github pages.
This module is essentially complete. There are a few rough edges that need to be smoothed.
next_stream()
method)Building requires:
Testing requires pytest (3.0+).
Note: it might work with other versions but only tested with these versions.
All development has been on 64-bit Linux, and it is regularly tested on
Travis-CI. The library is occasionally tested on Linux 32-bit,
OSX 10.10, PC-BSD 10.2 (should also work on Free BSD) and Windows
(Python 2.7/3.5, both 32 and 64-bit).
Basic tests are in place for all RNGs. The MT19937 is tested against NumPy's implementation for identical results. It also passes NumPy's test suite.
python setup.py install
dSFTM
makes use of SSE2 by default. If you have a very old computer
or are building on non-x86, you can install using:
python setup.py install --no-sse2
Either use a binary installer, or if building from scratch, use
Python 3.5 with Visual Studio 2015 Community Edition. It can also be
build using Microsoft Visual C++ Compiler for Python 2.7 and Python 2.7,
although some modifications may be needed to distutils
to find the
compiler.
The separate generators are importable from randomstate.prng
.
import randomstate
rs = randomstate.prng.xorshift128.RandomState()
rs.random_sample(100)
rs = randomstate.prng.pcg64.RandomState()
rs.random_sample(100)
# Identical to NumPy
rs = randomstate.prng.mt19937.RandomState()
rs.random_sample(100)
Like NumPy, randomstate
also exposes a single instance of the
mt19937
generator directly at the module level so that commands like
import randomstate
randomstate.standard_normal()
randomstate.exponential(1.0, 1.0, size=10)
will work.
Standard NCSA, plus sub licenses for components.
Performance is promising, and even the mt19937 seems to be faster than NumPy's mt19937.
Speed-up relative to NumPy (Uniform Doubles)
************************************************************
randomstate.prng-dsfmt-random_sample 313.5%
randomstate.prng-mlfg_1279_861-random_sample 459.4%
randomstate.prng-mrg32k3a-random_sample -57.6%
randomstate.prng-mt19937-random_sample 72.5%
randomstate.prng-pcg32-random_sample 232.8%
randomstate.prng-pcg64-random_sample 330.6%
randomstate.prng-xoroshiro128plus-random_sample 609.9%
randomstate.prng-xorshift1024-random_sample 348.8%
randomstate.prng-xorshift128-random_sample 489.7%
Speed-up relative to NumPy (Normals using Box-Muller)
************************************************************
randomstate.prng-dsfmt-standard_normal 26.8%
randomstate.prng-mlfg_1279_861-standard_normal 30.9%
randomstate.prng-mrg32k3a-standard_normal -14.8%
randomstate.prng-mt19937-standard_normal 17.7%
randomstate.prng-pcg32-standard_normal 24.5%
randomstate.prng-pcg64-standard_normal 26.2%
randomstate.prng-xoroshiro128plus-standard_normal 31.4%
randomstate.prng-xorshift1024-standard_normal 27.4%
randomstate.prng-xorshift128-standard_normal 30.3%
Speed-up relative to NumPy (Normals using Ziggurat)
************************************************************
randomstate.prng-dsfmt-standard_normal 491.7%
randomstate.prng-mlfg_1279_861-standard_normal 439.6%
randomstate.prng-mrg32k3a-standard_normal 101.2%
randomstate.prng-mt19937-standard_normal 354.4%
randomstate.prng-pcg32-standard_normal 531.0%
randomstate.prng-pcg64-standard_normal 517.9%
randomstate.prng-xoroshiro128plus-standard_normal 674.0%
randomstate.prng-xorshift1024-standard_normal 486.7%
randomstate.prng-xorshift128-standard_normal 617.0%