random.randint()用-1调用?

问题描述 投票:-2回答:3

有人可以解释为什么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)
python python-3.x random
3个回答
1
投票

random.randint()的第二个价值是包容性的。它将从10个随机整数中选择一个数字(0123456789),其中列表中只有9个索引。 len(messages)9,但没有messages[9]索引,因为Python索引从0开始。相反,唯一有效的指数从08

因此,通过使用random.randint(0, len(messages) - 1),该函数仅限于为messages列表选择有效索引。

代码应该使用random.choice(),它从列表中选择一个随机元素:

list_select = random.choice(messages)

在其他情况下,random.randrange()也可以是一个选项,因为它不包括可能值中的端点,类似于Python索引,切片和range()

index_select = random.randrange(len(messages))

0
投票

这是因为random.randint选择列表的索引,随机从0到8,并选择一条消息。 现在,列表的索引从0len(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


0
投票

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。

© www.soinside.com 2019 - 2024. All rights reserved.