.. _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 `__ 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.