如何在python 3中的随机种子上使用randrange()?

时间:2017-06-02 10:31:09

标签: python python-3.x random

所以,我在课堂上被要求使用特定的随机种子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'`

我可以解释一下错误:(

2 个答案:

答案 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)