2017-06-02 75 views
0

所以,我在课堂上被问到使用特定的随机种子237.但我不知道如何正确实施它。例如,这是我的代码。 in python 3。 在这个例子中,我基本上抛出m个骰子数量为k的边,并试图返回一个长度为m的元组。如何在python 3的随机种子上使用randrange()?

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

种子基本上告诉你的随机数发生器如何是随机的(使用相同的种子,它总是会选择相同的数字)。你想要的就是这样调用它:'die = random.randrange(1,k + 1)' – Kai

回答

2

很简单的解释:在第二行,你创建了一个对象,rng,这是random.seed(237)的返回值,恰巧random.seed总是返回None,所以后来在你的代码中,当你尝试rng.randrange时,Python会查找一个attr ibute命名为randrangerng对象。但rng对象是None,它没有randrange属性。

你的意思只是random.randrange(1, k+1)而不是rng.randrange(1, k+1)

+0

好的,如果我导入种子,我不必在代码中引用它。我可以使用random.randrange()? –

+0

对不起,迟到了,但是。你可以通过设置种子来尝试,然后询问一个随机数(或范围)。如果您然后重新设置种子为相同的值,并要求另一个随机数(或范围)它应该是相同的。 – acdr

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类的实例来轻松完成此操作;该类的构造函数将seed作为可选参数。

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) 
+0

随着Python 3.6可以使用'random.choices'并保存显式循环我认为 –

+0

@Chris_Rands是正确的,但由于这是作业,所以OP可能需要使用'randrange'。 TBH,我一直忘记存在“选择”。 :)对于这个任务,我可能会使用'randint(1,k)'。 –