getrandbits不会产生恒定长度的数字

drd*_*dot 1 python random

我使用python 2.6.6.我使用getrandbits(128)来获得128位随机数.

a = random.getrandbits(128)
Run Code Online (Sandbox Code Playgroud)

但是,位数并不总是128.有时小于此数.这是什么原因?有没有更稳定的库?

Mar*_*ers 6

这128位中的每一位都可以是0或1; 如果最左边的位为0,则您的数字将小于2**127,但仍然会生成它们.这是预期和完全正常的行为.

如果您需要最左边的位为1,请始终使用randrange():

a = random.randrange(1 << 127, 1 << 128)
Run Code Online (Sandbox Code Playgroud)

这会生成一个保证第一位设置为1的数字.或者,生成一个127位的数字并添加1 << 127到它:

a = random.getrandbits(127) + (1 << 127)
Run Code Online (Sandbox Code Playgroud)

getrandbits()使用format()数字将输出格式化为0填充二进制时,可以看到此行为:

>>> format(random.getrandbits(8), '08b')
'00011110'
>>> format(random.getrandbits(8), '08b')
'01000010'
>>> format(random.getrandbits(8), '08b')
'00110010'
>>> format(random.getrandbits(8), '08b')
'10101010'
>>> format(random.getrandbits(8), '08b')
'10000110'
Run Code Online (Sandbox Code Playgroud)

这些数字是完全随机的,但有时候最左边的位最终会出现0.通过少生成1位,并将最左边的位设置为1,您可以生成随机值的一半,但保证您看到"全部"位:

>>> format(random.getrandbits(7) + (1 << 8), '08b')
'100010110'
>>> format(random.getrandbits(7) + (1 << 8), '08b')
'101111101'
>>> format(random.getrandbits(7) + (1 << 8), '08b')
'101000111'
>>> format(random.getrandbits(7) + (1 << 8), '08b')
'101011111'
Run Code Online (Sandbox Code Playgroud)

这完全取决于你想要做什么,如果这是完全可取的.

  • 事实上,最左边的位*将为零的可能性为50%:) (3认同)