有人可以解释为什么range
中的random.randint(0, len(messages) - 1)
最后会减1吗?该列表有9个值:
import random
messages = ['It is certain',
'It is decidedly so',
'Yes definitely',
'Reply hazy try again',
'Ask again later',
'Concentrate and ask again',
'My reply is no',
'Outlook not so good',
'Very doubtful']
select_number = random.randint(0, len(messages) - 1)
list_select = messages[select_number]
print(list_select)
random.randint()
的第二个价值是包容性的。它将从10个随机整数中选择一个数字(0
,1
,2
,3
,4
,5
,6
,7
,8
和9
),其中列表中只有9个索引。 len(messages)
是9
,但没有messages[9]
索引,因为Python索引从0
开始。相反,唯一有效的指数从0
到8
。
因此,通过使用random.randint(0, len(messages) - 1)
,该函数仅限于为messages
列表选择有效索引。
代码应该使用random.choice()
,它从列表中选择一个随机元素:
list_select = random.choice(messages)
在其他情况下,random.randrange()
也可以是一个选项,因为它不包括可能值中的端点,类似于Python索引,切片和range()
:
index_select = random.randrange(len(messages))
这是因为random.randint
选择列表的索引,随机从0到8,并选择一条消息。
现在,列表的索引从0
到len(messages)-1=8
。
根据文件:https://docs.python.org/3/library/random.html#random.randint
random.randint(a,b)。返回一个随机整数N,使得a <= N <= b。 randrange的别名(a,b + 1)。
这意味着选择0到8之间的整数,这是列表的有效索引。如果我们改为放入len(messages)
,那么索引9也会被选中,这是Python中列表的无效索引,因为Python列表是0-indexed
random.randint(a, b)
返回一个随机整数N,使得<= N <= b。
len(messages) - 1
有点棘手,因为你的列表的范围确实是9,但你必须记住,计数从0开始而不是1.所以在你的情况下,len(messages)
将返回9但第一个元素是在messages[0]
这意味着在你的情况下,select_number = random.randint(0, len(messages) - 1)
将给出从0到len(messages) - 1
的数字,即9 - 1。