【问题标题】:How do I use randrange() on a random seed in python 3?如何在 python 3 中对随机种子使用 randrange()?
【发布时间】:2017-06-02 10:31:09
【问题描述】:

所以,我在课堂上被要求使用特定的随机种子 237。但我不知道如何正确实现它。例如,这是我的代码。 在 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'`

我能解释一下出了什么问题吗:(

【问题讨论】:

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

标签: python python-3.x random


【解决方案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)

【讨论】:

  • 使用 Python 3.6 可以使用 random.choices 并保存我认为的显式循环
  • @Chris_Rands 是的,但由于这是家庭作业,可能需要 OP 使用randrange。 TBH,我一直忘记choices 的存在。 :) 对于这个任务,我可能会使用randint(1, k)
【解决方案2】:

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

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

【讨论】:

  • 好的,所以如果我导入种子,我不必在我的代码中引用它吗?我可以使用 random.randrange() 吗?
  • 抱歉,回复晚了,但是是的。您可以自己尝试设置种子,然后要求随机数(或范围)。如果您随后将种子重新设置为相同的值,并要求另一个随机数(或范围),它应该是相同的。
猜你喜欢
  • 2019-03-30
  • 1970-01-01
  • 2020-02-16
  • 2016-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多