随机模块中的random.Random(不是random.random)实际上在Python中做什么?

时间:2018-12-14 11:52:27

标签: python random

我想对random.Random函数/类的实际作用有一个清晰的解释。这就是Python的随机模块必须说的。

  

绑定模块函数使用的随机数生成器基类。   用于实例化Random实例以获取不生成的生成器   共享状态。对于多线程程序特别有用,它可以创建   每个线程使用不同的Random实例,并使用   jumpahead()方法可确保每个生成的序列均可见   线程不重叠。

     

如果您想使用其他类型的随机类,也可以将其子类化   您自己设计的基本生成器:在这种情况下,请覆盖   以下方法:random(),seed(),getstate(),setstate()和   跳跃前进()。 (可选)实现getrandbits()方法,以便   randrange()可以覆盖任意大范围。

我不明白这一点,因为我仍然是Python的初学者。我确实对基类和派生类有所了解,这显然与它有关。

我尝试使用Python的IDLE中的random.Random()函数/类,发现了以下内容。

  • 似乎只接受1个参数。(字符串,整数,浮点数)
  • 似乎没有接受任何列表或字典作为参数;声明它们是不可哈希的。 (“不可散列”是什么意思?)
  • 它似乎仅在反复调用它时才返回两个值,而不管传递给它的参数如何,两个值分别是“ 0x03F24E40处的random.Random对象”和“ 0x03F26B60处的random.Random对象”。

我希望我能对random.Random的作用做一个简单的解释,并解释为什么它只返回两个值。 (我是一个初学者,所以请原谅我对此主题的无知!)

欢迎对任何诸如seed(),getstate(),setstate()和jumpahead()之类的功能的解释,或对任何解释此类解释的文档/书籍的引用。

1 个答案:

答案 0 :(得分:1)

简单来说,random.Random()创建一个伪随机数生成器,即一个对象,该对象生成一系列看起来随机的数字(是 pseudorandom )。

random.Random()接受一个对象,该对象可以是“字符串”,“ int”(整数)或“ float”(整数或非整数,例如3.2或888)。该对象称为 seed ,它可用于创建生成特定伪随机数序列的对象。例如,您可以致电-

  • random.Random(57)
  • random.Random(888.6)
  • random.Random("Hello World")
  • random.Random(99898989)

获取特定伪随机数序列的生成器。但是,只有在程序中需要可重复的“随机性”时,才应指定 seed

然后您可以使用此生成器从该序列中提取伪随机数:

# Create a generator without
# a seed, so that the pseudorandom
# sequence will almost surely differ
# from run to run
randomGen = random.Random()
# Generate a number in [0, 1)
number = randomGen.random()
# Generate an integer in [0, 5]
number = randomGen.randint(0, 5)

请注意,该示例将生成器从random.Random分配给名为randomGen的变量;通常,仅创建生成器本身并没有用。