-2
votes

Appelez-vous au hasard.Randint () avec -1?

Quelqu'un peut-il expliquer pourquoi la plage dans le aléatoire.randint (0, len (messages) - 1) a un moins 1 à la fin? La liste a 9 valeurs: xxx


3 commentaires

Cela aiderait si vous élaboreriez pourquoi cela vous frappe exactement comme impair.


Parce qu'il a été écrit par quelqu'un qui n'est pas très familier avec Python? Peut-être qu'ils ont fait une traduction directe du code d'une autre langue. La manière sensée serait d'utiliser aléatoire.choice ou de rester plus proche de l'original, select_number = aléatoire.randrange (messages)


Ironiquement, Randint était un ajout tardif au aléatoire , pour les personnes qui ont trouvé randrange déroutant. Mais si quelqu'un a des problèmes avec randrange Comment faire face à la plage ou la notation de tranche?


3 Réponses :


1
votes

aléatoire.randint () s deuxième valeur est inclusif . Il choisira un numéro de 10 entiers aléatoires ( 0 , 1 , 2 , 3 < / code>, 4 , 5 , 6 , 7 , 8 et < Code> 9 ), où vous avez seulement 9 indices dans la liste. len (messages) est 9 , mais il n'y a pas de messages [9] index, car l'indexation Python commence à 0 . Au lieu de cela, les seuls indices valides vont de 0 à 8 .

donc en utilisant aléatoire.randint (0, len (messages) - 1) , la fonction est limitée à la sélection d'un index valide pour la liste Messages .

Le code doit plutôt utiliser aléatoire.choice () , qui choisit un élément aléatoire à partir d'une liste: xxx

dans d'autres situations, < code> aléatoire.randrange () pourrait être une option aussi, car il n'inclut pas le point final dans les valeurs possibles, fonctionnant analogues à l'indexation de Python, à la tranchée et à la plage () : xxx


4 commentaires

Ne choisira pas d'index au hasard via aléatoire.randint et en choisissant cet élément, par rapport à l'utilisation de aléatoire.choice pour choisir un élément de la liste, soyez la même chose?


@Deveshkumarsingh: Oui, le résultat final est le même. Mais aléatoire.choice () vous permet d'éviter les erreurs plus facilement et est plus propre et plus claire lors de la lecture du code.


A du sens, je suppose que la logique interne de aléatoire.choice peut utiliser aléatoire.randint d'une manière!


@Deveshkumarsingh: Non, il utilise une méthode interne _rand_below , voir le code source .



0
votes

Ceci est parce que aléatoire.randint choisit les index de la liste, de 0 à 8 au hasard et sélectionne un message.
Maintenant, les index d'une liste vont de 0 à len (messages) -1 = 8 .
Selon les documents: https://docs.python.org/3 /Library/random.html#random.randint

aléatoire.Randint (A, B). Renvoie un entier aléatoire N telle qu'un <= n <= b. Alias ​​pour randrange (A, B + 1).

ce qui signifie qu'un entier compris entre 0 et 8 est cueillé, qui sont les index valides de la liste, si nous disposons à la place de mettre len (messages) , l'index 9 aurait été choisi aussi, ce qui est un Index non valide pour une liste dans Python, car les listes Python sont 0-indexé


0 commentaires

0
votes

aléatoire.randint (A, B) renvoie un entier aléatoire n tel qu'un <= N <= B.

len (messages) - 1 est un peu délicat car la portée de votre liste est en effet 9 mais que vous devez vous rappeler que le comptage commence à partir de 0 au lieu de 1. Donc, dans votre cas len (messages) va retourner 9 mais le premier élément est dans messages [0]

Cela signifie que, dans votre cas, le select_number = aléatoire.randint (0, len (messages) - 1) donnera un numéro de 0 à len (messages) - 1 qui est 9 - 1.


0 commentaires