2015-12-14 68 views
0

我有一个使用random.Random和random.SystemRandom的python脚本。 我使用SystemRandom对象来播种Random对象。来自随机对象的值在模拟中使用,并且打印种子值以供用户重现结果。为什么Python的getrandbits()永远不会产生负数?

但是,我注意到,如果我调用getrandbits(64),它们中的任何一个都不会显示数字为负数。它总是一个正整数。

由于随机性,我认为接近50%的时间会产生负值(通过将最左边的位设置为1)。

为什么我的期望不正确?

我的实现:

sr = random.SystemRandom() 
seed = sr.getrandbits(64) 
seedgen = random.Random(seed) 
... 
seedgen.getrandbits(64) 
+0

你系统上的C'long'有多大? –

+0

@MadPhysicist 8个字节。 – Anro

回答

1

Python的廉政局不限于64位。它们被提升为Python longs(任意精度)

+1

我在交互式提示中看到,它们确实附加了L.因此,这是否意味着没有负值,精度会增加,因此它总是保持正值? – Anro

+1

是的,这是正确的。 –

1

如果python的内置整数大于64位,它们会变成long(任意精度整数)。您可以使用Python轻松计算2**150,并得到结果1427247692705959881058285969449495136382746624LL后缀表示该类型是Python long,它具有无限精度)。

+1

'int'和'long'之间的区别在Python3中隐藏得更好 –

+1

然而,由于我只生成一个64位数字,所以我认为精确度恰好为64位。我在交互式提示中看到了-L后缀。这听起来像任意的精度不允许负值,除非设置了一个标志。 – Anro

+1

@Anro正常整数是64位* signed *类型,但由'getrandbits()'生成的值总是正数。因此,如果您尝试生成超过63位(可以保持在一个有符号的64位整数中的最大正值),它将被提升为Python长。 – C0deH4cker

相关问题