所以,我在课堂上被要求使用特定的随机种子237.但我不知道如何正确实施它。例如,这是我的代码。 in python 3 。 在这个例子中,我基本上扔了m个具有k个边的骰子,并试图返回一个m长的元组。
import random
rng=random.seed(237)
# create random number generator
def throwDice(m, k):
x = 0
L = []
while x < m :
die = rng.randrange(1,k+1)
L.append(die)
x+=1
return print(tuple(L))
throwDice(11,5)
然而,命令提示符一直显示错误
die = rng.randrange(1,k+1)
AttributeError: 'NoneType' object has no attribute 'randrange'`
我可以解释一下错误:(
答案 0 :(得分:2)
非常简单:在第二行中,您创建了一个名为rng
的对象,它是random.seed(237)
的返回值。恰好random.seed
总是返回None
。所以稍后在您的代码中,当您尝试rng.randrange
时,Python将查找randrange
对象的名为rng
的属性。但rng
对象为None
,没有randrange
属性。
你真正想要的只是random.randrange(1, k+1)
而不是rng.randrange(1, k+1)
。
答案 1 :(得分:1)
random.seed
返回None
,所以在
rng=random.seed(237)
rng
设置为None
。然后你试着打电话
None.randrange(1,k+1)
在你的功能中,显然这不起作用。
此外,print
函数返回None
,所以
return print(tuple(L))
将返回None
。你不希望这样。
这是修复后的代码版本。
import random
random.seed(237)
# create random number generator
def throwDice(m, k):
L = []
for x in range(m):
die = random.randrange(1, k+1)
L.append(die)
return tuple(L)
print(throwDice(11, 5))
<强>输出强>
(5, 4, 2, 2, 4, 1, 2, 5, 4, 5, 1)
在Python 2上,你得到了这个输出:
(4, 5, 5, 4, 1, 1, 4, 5, 3, 3, 1)
我使用了for
循环来执行所需数量的骰子滚动,这比使用while
循环和“x += 1
”手动“计数滚动”更好。我们实际上并没有在该循环中使用x
的值,并且在Python中使用_
作为循环变量的名称是常见的约定,即,
for _ in range(m):
FWIW,我们可以通过使用生成器表达式以紧凑的方式编写此函数:
def throwDice(m, k):
return tuple(random.randrange(1, k+1) for _ in range(m))
在某些情况下,我们需要多个独立的随机数流。我们可以通过创建Random
类的实例轻松地做到这一点;该类的构造函数将种子作为可选参数。
import random
# Create a random number generator, and seed it
myrandom = random.Random(237)
def throwDice(m, k):
L = []
for _ in range(m):
die = myrandom.randrange(1, k+1)
L.append(die)
return tuple(L)