blob: d5543661ce98727b43fa4da3bdc666243971f151 [file]
.. _librt-random:
librt.random
============
The ``librt.random`` module is part of the ``librt`` package on PyPI, and it provides
pseudorandom number generation utilities. It can be used as a significantly faster
alternative to the stdlib :mod:`random` module in compiled code. It can also be faster
than stdlib ``random`` in interpreted code, depending on use case.
The module uses the `ChaCha8 <https://cr.yp.to/chacha.html>`__ algorithm with forward
secrecy. It is **not** suitable for cryptographic use, but it provides high-quality,
statistically uniform output.
Functions
---------
The module provides module-level functions that use thread-local state, so they are
safe to call concurrently from multiple threads without external locking, and they
scale well even if used from multiple threads:
.. function:: random() -> float
Return a random floating-point number in the range [0.0, 1.0).
.. function:: randint(a: i64, b: i64) -> i64
Return a random integer *n* such that *a* <= *n* <= *b*.
.. function:: randrange(stop: i64, /) -> i64
randrange(start: i64, stop: i64, /) -> i64
Return a random integer from the range. With one argument, the range is [0, *stop*).
With two arguments, the range is [*start*, *stop*).
.. function:: seed(n: i64, /) -> None
Seed the thread-local random number generator. This only affects module-level
functions called from the current thread.
Random class
------------
.. class:: Random(seed: i64 | None = None)
A pseudorandom number generator instance with its own independent state. Use this
when you need reproducible sequences or want to avoid interference with the
thread-local state used by the module-level functions.
If *seed* is ``None``, the generator is seeded from OS entropy
(via :func:`os.urandom`).
It's not safe to use the same ``Random`` instance concurrently from multiple
threads without synchronization on free-threaded Python builds.
.. method:: random() -> float
Return a random floating-point number in the range [0.0, 1.0).
.. method:: randint(a: i64, b: i64) -> i64
Return a random integer *n* such that *a* <= *n* <= *b*.
.. method:: randrange(stop: i64, /) -> i64
randrange(start: i64, stop: i64, /) -> i64
Return a random integer from the range. With one argument, the range is [0, *stop*).
With two arguments, the range is [*start*, *stop*).
.. method:: seed(n: i64, /) -> None
Reseed the generator.
Example
-------
Using module-level functions::
from librt.random import randint, seed
def roll_dice() -> i64:
return randint(1, 6)
Using a ``Random`` instance for reproducible sequences::
from librt.random import Random
def generate_data() -> list[i64]:
rng = Random(42)
return [rng.randint(0, 100) for _ in range(10)]
Backward compatibility
----------------------
New versions of this module are not guaranteed to generate the same results when
using the same seed. A specific seed only produces predictable random numbers on a
specific version of ``librt``. In the future we might provide stronger guarantees.