2022-05-20 14:49:30 +01:00
|
|
|
"""Set of random number generator functions: seeding, generator, hashing seeds."""
|
2023-11-07 13:27:25 +00:00
|
|
|
from __future__ import annotations
|
2021-12-08 22:14:15 +01:00
|
|
|
|
|
|
|
import numpy as np
|
2016-05-29 09:07:09 -07:00
|
|
|
|
2022-09-08 10:10:07 +01:00
|
|
|
from gymnasium import error
|
2016-05-29 09:07:09 -07:00
|
|
|
|
2021-07-29 02:26:34 +02:00
|
|
|
|
2023-11-07 13:27:25 +00:00
|
|
|
def np_random(seed: int | None = None) -> tuple[np.random.Generator, int]:
|
|
|
|
"""Returns a NumPy random number generator (RNG) along with seed value from the inputted seed.
|
|
|
|
|
|
|
|
If ``seed`` is ``None`` then a **random** seed will be generated as the RNG's initial seed.
|
|
|
|
This randomly selected seed is returned as the second value of the tuple.
|
|
|
|
|
|
|
|
.. py:currentmodule:: gymnasium.Env
|
|
|
|
|
|
|
|
This function is called in :meth:`reset` to reset an environment's initial RNG.
|
2022-05-20 14:49:30 +01:00
|
|
|
|
|
|
|
Args:
|
|
|
|
seed: The seed used to create the generator
|
|
|
|
|
|
|
|
Returns:
|
2023-11-07 13:27:25 +00:00
|
|
|
A NumPy-based Random Number Generator and generator seed
|
2022-05-25 14:46:41 +01:00
|
|
|
|
|
|
|
Raises:
|
2023-11-07 13:27:25 +00:00
|
|
|
Error: Seed must be a non-negative integer
|
2022-05-20 14:49:30 +01:00
|
|
|
"""
|
2020-04-10 17:10:34 -05:00
|
|
|
if seed is not None and not (isinstance(seed, int) and 0 <= seed):
|
2022-11-11 14:22:59 +00:00
|
|
|
if isinstance(seed, int) is False:
|
|
|
|
raise error.Error(
|
|
|
|
f"Seed must be a python integer, actual type: {type(seed)}"
|
|
|
|
)
|
|
|
|
else:
|
|
|
|
raise error.Error(
|
|
|
|
f"Seed must be greater or equal to zero, actual value: {seed}"
|
|
|
|
)
|
2016-05-29 09:07:09 -07:00
|
|
|
|
2021-12-08 22:14:15 +01:00
|
|
|
seed_seq = np.random.SeedSequence(seed)
|
2021-12-22 19:12:57 +01:00
|
|
|
np_seed = seed_seq.entropy
|
2021-12-08 22:14:15 +01:00
|
|
|
rng = RandomNumberGenerator(np.random.PCG64(seed_seq))
|
2021-12-22 19:12:57 +01:00
|
|
|
return rng, np_seed
|
2016-05-29 09:07:09 -07:00
|
|
|
|
2021-07-29 02:26:34 +02:00
|
|
|
|
2022-08-22 09:20:28 -04:00
|
|
|
RNG = RandomNumberGenerator = np.random.Generator
|