web-dev-qa-db-fra.com

Créer systématiquement le même tableau numpy aléatoire

J'attends qu'un autre développeur termine un morceau de code qui renverra un tableau np de forme (100,2000) avec des valeurs de -1,0 ou 1.

En attendant, je souhaite créer de manière aléatoire un tableau présentant les mêmes caractéristiques afin de pouvoir prendre une longueur d'avance sur mon développement et mes tests. Le fait est que je veux que ce tableau créé aléatoirement soit le même à chaque fois, de sorte que je ne teste pas contre un tableau qui change constamment de valeur chaque fois que je relance mon processus.

Je peux créer mon tableau comme ceci, mais existe-t-il un moyen de le créer pour qu'il soit identique à chaque fois? Je peux décaper l'objet et le décaper, mais je me demande s'il existe un autre moyen.

r = np.random.randint(3, size=(100, 2000)) - 1
78
Idr

Amorcez simplement le générateur de nombres aléatoires avec une valeur fixe, par ex.

numpy.random.seed(42)

De cette façon, vous obtiendrez toujours la même séquence de nombres aléatoires.

78
Sven Marnach

Créez votre propre instance de numpy.random.RandomState() avec la graine choisie. N'utilisez pas numpy.random.seed() sauf pour contourner des bibliothèques inflexibles qui ne vous permettent pas de faire passer votre propre instance RandomState.

[~]
|1> from numpy.random import RandomState

[~]
|2> prng = RandomState(1234567890)

[~]
|3> prng.randint(-1, 2, size=10)
array([ 1,  1, -1,  0,  0, -1,  1,  0, -1, -1])

[~]
|4> prng2 = RandomState(1234567890)

[~]
|5> prng2.randint(-1, 2, size=10)
array([ 1,  1, -1,  0,  0, -1,  1,  0, -1, -1])
160
Robert Kern

Si vous utilisez d'autres fonctions en fonction d'un état aléatoire, vous ne pouvez pas simplement définir une valeur initiale, mais créer une fonction pour générer votre liste aléatoire de nombres et définir la valeur initiale comme paramètre de la fonction. Cela ne perturbera aucun autre générateur aléatoire dans le code: 

# Random states
def get_states(random_state, low, high, size):
    rs = np.random.RandomState(random_state)
    states = rs.randint(low=low, high=high, size=size)
    return states

# Call function
states = get_states(random_state=42, low=2, high=28347, size=25)
3
mari756h

Il est important de comprendre quelle est la graine d’un générateur aléatoire et quand/comment elle est définie dans votre code (consultez, par exemple, ici pour une explication de Nice de la signification mathématique de la graine).

Pour cela, vous devez définir la graine en faisant:

random_state = np.random.RandomState(seed=your_favorite_seed_value)

Il est alors important de générer les nombres aléatoires à partir de random_state et non à partir de np.random. C'est à dire. tu devrais faire:

random_state.randint(...)

au lieu de 

np.random.randint(...) 

qui créera une nouvelle instance de RandomState () et utilisera essentiellement l’horloge interne de votre ordinateur pour définir le germe.

0
t_sic