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

在python 3中,如何对随机种子使用randrange()?,python,python-3.x,random,Python,Python 3.x,Random,所以,我在课堂上被要求使用特定的随机种子237。但我不知道如何正确地实施它。例如,这是我的代码。在Python3中。 在这个例子中,我基本上是掷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.ran

所以,我在课堂上被要求使用特定的随机种子237。但我不知道如何正确地实施它。例如,这是我的代码。在Python3中。 在这个例子中,我基本上是掷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)

我能解释一下错误吗:(

非常简单:在第二行中,您正在创建一个名为
rng
的对象,它是
random.seed(237)的返回值)
。碰巧
random.seed
总是返回
None
。因此,在代码的后面,当您尝试
rng.randrange
时,Python将查找
rng
对象的名为
randrange
的属性。但是
rng
对象是
None
,它没有
range>属性


你真正的意思只是
random.randrange(1,k+1)
,而不是
rng.randrange(1,k+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
循环来执行所需数量的掷骰子,这比在
循环和“手动”时使用
要好用
x+=1
计算转鼓数。我们实际上并没有在该循环中使用
x
的值,在Python中,在这种情况下使用
\uu
作为循环变量的名称是一种常见的约定,即

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)

使用Python3.6可以使用
random.choices
并保存显式循环ithink@Chris_Rands是的,但由于这是家庭作业,OP可能需要使用
randrange
。TBH,我一直忘记
选项存在。:)对于这项任务,我可能会使用
randint(1,k)
。种子基本上是告诉您的随机数生成器如何成为随机数(使用相同的种子,它将始终拾取相同的数字)。你想要的是这样称呼它:
die=random.randrange(1,k+1)
Ok,那么如果我导入种子,我就不必在代码中引用它了?我可以使用random.randrange()?很抱歉,响应太晚,但是可以。您可以通过设置种子,然后询问随机数(或范围)来自己尝试。如果随后将种子重新设置为相同的值,并要求另一个随机数(或范围),则该值应相同。
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)