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 au hasard un tableau des mêmes caractéristiques afin de pouvoir avoir une longueur d'avance sur mon développement et mes tests. Le fait est que je veux que ce tableau créé au hasard soit le même à chaque fois, de sorte que je ne teste pas contre un tableau qui ne cesse de changer sa valeur à chaque fois que je réexécute mon processus.
Je peux créer mon tableau comme ça, mais y a-t-il un moyen de le créer pour qu'il soit le même à chaque fois. Je peux décaper l'objet et le décoller, mais je me demande s'il existe un autre moyen.
r = np.random.randint(3, size=(100, 2000)) - 1
numpy.random.seed()
fonction alors que je ne faisais pas attention. :-) Je l'ai laissé intentionnellement hors du module d'origine. Je recommande aux gens d'utiliser leurs propres instancesRandomState
et de faire circuler ces objets.numpy.random.seed()
est déconseillée, cela doit être mentionné dans la documentation . Apparemment, les autres contributeurs à NumPy ne partagent pas l'opinion de Robert. Aucune offense du tout, je suis juste curieuse.random.seed
ou l'utilisation d'unrandom.Random
objet dans la bibliothèque standard Python. Si vous utilisezrandom.seed
ounumpy.random.seed
, vous amorcez toutes les instances aléatoires, à la fois dans votre code et dans tout code que vous appelez ou dans tout code exécuté dans la même session que la vôtre. Si ces choses dépendent du fait que ces choses sont en fait aléatoires, alors vous commencez à rencontrer des problèmes. Si vous déployez du code qui définit la valeur de départ aléatoire, vous pouvez introduire une vulnérabilité de sécurité.Créez votre propre instance de
numpy.random.RandomState()
avec la graine choisie. Ne l'utiliseznumpy.random.seed()
que pour contourner des bibliothèques inflexibles qui ne vous permettent pas de transmettre votre propreRandomState
instance.[~] |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])
la source
numpy.random.seed()
? Je sais que ce n'est pas thread-safe, mais c'est vraiment pratique si vous n'avez pas besoin de thread-safety.numpy.random
, vous ne pourrez pas créer de flux indépendants ultérieurement. Il est également plus facile d'écrire des bibliothèques avec l'intention de contrôler les flux PRNG. Il existe toujours plusieurs façons d'entrer dans votre bibliothèque, et chacune d'elles devrait avoir un moyen de contrôler la graine. Faire circuler des objets PRNG est une façon plus propre de le faire que de se fiernumpy.random.seed()
. Malheureusement, cette zone de commentaire est trop courte pour contenir plus d'exemples. :-)numpy.random.RandomState()
sans arguments. Cela amorcera l'état avec des valeurs uniques tirées des installations de votre système d'exploitation pour de telles choses (/dev/urandom
sur les machines UNIX et l'équivalent Windows là-bas). Si celanumpy.random.RandomState(1234567890)
ne fonctionne pas pour vous, veuillez montrer exactement ce que vous avez tapé et exactement le message d'erreur que vous avez reçu.numpy.random.RandomState()
sans arguments pour les meilleurs résultats.Si vous utilisez d'autres fonctions reposant sur un état aléatoire, vous ne pouvez pas simplement définir une valeur de départ globale, mais plutôt créer une fonction pour générer votre liste aléatoire de nombres et définir la valeur de départ comme paramètre de la fonction. Cela ne dérangera 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)
la source
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 (vérifiez par exemple ici pour une belle explication de la signification mathématique de la graine).
Pour cela, vous devez définir la graine en faisant:
Il est alors important de générer les nombres aléatoires à partir de random_state et non de np.random. Ie vous devriez faire:
au lieu de
qui créera une nouvelle instance de RandomState () et utilisera essentiellement l'horloge interne de votre ordinateur pour définir la graine.
la source
Je veux juste clarifier quelque chose en ce qui concerne la réponse @Robert Kern au cas où cela ne serait pas clair. Même si vous utilisez le,
RandomState
vous devrez l'initialiser chaque fois que vous appelez une méthode aléatoire numpy comme dans l'exemple de Robert, sinon vous obtiendrez les résultats suivants.Python 3.6.9 |Anaconda, Inc.| (default, Jul 30 2019, 19:07:31) [GCC 7.3.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import numpy as np >>> prng = np.random.RandomState(2019) >>> prng.randint(-1, 2, size=10) array([-1, 1, 0, -1, 1, 1, -1, 0, -1, 1]) >>> prng.randint(-1, 2, size=10) array([-1, -1, -1, 0, -1, -1, 1, 0, -1, -1]) >>> prng.randint(-1, 2, size=10) array([ 0, -1, -1, 0, 1, 1, -1, 1, -1, 1]) >>> prng.randint(-1, 2, size=10) array([ 1, 1, 0, 0, 0, -1, 1, 1, 0, -1])
la source