Quelqu'un peut-il expliquer pourquoi la plage code> code> dans le aléatoire.randint (0, len (messages) - 1) code> a un moins 1 à la fin? La liste a 9 valeurs:
3 Réponses :
donc en utilisant Le code doit plutôt utiliser dans d'autres situations, < code> aléatoire.randrange () code> 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 aléatoire.randint () code> s deuxième valeur est
0 code>,
1 code>,
2 code>,
3 < / code>,
4 code>,
5 code>,
6 code>,
7 code>,
8 code> et < Code> 9 code>), où vous avez seulement 9 indices dans la liste.
len (messages) code> est
9 code>, mais il n'y a pas de messages
[9] code> index, car l'indexation Python commence à
0 code >. Au lieu de cela, les seuls indices valides vont de
0 code> à
8 code>.
aléatoire.randint (0, len (messages) - 1) Code>, la fonction est limitée à la sélection d'un index valide pour la liste code> Messages code>. p>
aléatoire.choice () code>
, qui choisit un élément aléatoire à partir d'une liste: p> () Code>: p>
Ne choisira pas d'index au hasard via aléatoire.randint code> et en choisissant cet élément, par rapport à l'utilisation de
aléatoire.choice code> 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 () code> 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 code> peut utiliser
aléatoire.randint code> d'une manière!
@Deveshkumarsingh: Non, il utilise une méthode interne _rand_below code>, voir le code source .
Ceci est parce que aléatoire.Randint (A, B).
Renvoie un entier aléatoire N telle qu'un <= n <= b. Alias pour randrange (A, B + 1). p>
blockQuote>
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 aléatoire.randint code> 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 code> à
len (messages) -1 = 8 code>.
Selon les documents: https://docs.python.org/3 /Library/random.html#random.randint p>
len (messages) code>, 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é code> p>
Cela signifie que, dans votre cas, le aléatoire.randint (A, B) code> renvoie un entier aléatoire n tel qu'un <= N <= B. P> P> P> P> P>
len (messages) - 1 code> 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) code> va retourner 9 mais le premier élément est dans
messages [0] code> p>
select_number = aléatoire.randint (0, len (messages) - 1) code> donnera un numéro de 0 à
len (messages) - 1 code > qui est 9 - 1. p>
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 code> ou de rester plus proche de l'original,
select_number = aléatoire.randrange (messages) code>
Ironiquement,
Randint code> était un ajout tardif au
aléatoire code>, pour les personnes qui ont trouvé
randrange code> déroutant. Mais si quelqu'un a des problèmes avec
randrange code> Comment faire face à la plage code> code> ou la notation de tranche?