我正在模拟Monty-Hall问题,这个片段是交换部分。
import random
i = 0
eliminated = 0
while i < 10:
i += 1
randFirstChoice = random.randint(1,3)
if randFirstChoice == 1:
eliminated += random.choice(2, 3)
elif randFirstChoice == 2:
eliminated += random.choice(1, 3)
elif randFirstChoice == 3:
eliminated += random.choice(1, 2)
print(eliminated)
每当我运行这个,我得到错误
TypeError:choice((接受2个位置参数,但有3个给定了
它为错误提供的行号是3个条件语句。我很困惑,因为我认为random.choice
会让我在两个数字之间随机选择,据我所知,这就是我试图做的
random.choice
实际上是单个共享random.Random
实例的绑定方法。与random.Random
方法名称匹配的random
的顶级函数都是这样生成的;它节省了两次重新实现相同功能的时间。
这两个参数是self
(由于它是预绑定的,所以隐式传递(和可供选择的序列。您传递了self
(隐式(和两个非序列参数(显式(。
如果您想在两个值之间进行选择,请将它们作为tuple
传递,例如:
import random
i = 0
eliminated = 0
while i < 10:
i += 1
randFirstChoice = random.randint(1,3)
if randFirstChoice == 1:
eliminated += random.choice((2, 3)) # Extra parens for a tuple
elif randFirstChoice == 2:
eliminated += random.choice((1, 3)) # Extra parens for a tuple
elif randFirstChoice == 3:
eliminated += random.choice((1, 2)) # Extra parens for a tuple
print(eliminated)
put您的random.choice
在输入中获取一个序列。
import random
i = 0
eliminated = 0
while i < 10:
i += 1
randFirstChoice = random.randint(1,3)
if randFirstChoice == 1:
eliminated += random.choice([2, 3])
elif randFirstChoice == 2:
eliminated += random.choice([1, 3])
elif randFirstChoice == 3:
eliminated += random.choice([1, 2])
print(eliminated)
random.choice
是一个类方法。其第一参数(self
(已经被设置为函数的第一参数。
以下是后端(random.py(中choice
函数的代码
def choice(self, seq):
"""Choose a random element from a non-empty sequence."""
try:
i = self._randbelow(len(seq))
except ValueError:
raise IndexError('Cannot choose from an empty sequence') from None
return seq[i]
我认为您误解了该方法的使用。random.choice()
只取一个参数,该参数必须是列表。尝试random.choice(['a','b','c'])
。如果你想要一个范围内的数字,你可以使用random.randint(2,30)