衡量它是否足够快以满足您的目的,“随机性”可能会随着您的称呼而减少:os.urandom(250)
. 它产生一个二进制字符串,也就是字节。
为避免“long int too large to convert to float”错误,请勿使用浮点数。
如果您需要一个带有k
随机位的整数而不是二进制字符串:
import random
r = random.SystemRandom()
n = r.getrandbits(2000) # uses os.urandom() under the hood
获取一串“0”和“1”:
k = 2000
binstr = "{:0{}b}".format(r.getrandbits(k), k)
注意:如果不使用,则不能用于randint/randrange
大数getrandbits
:
import random
class R(random.Random):
def random(self): # override random to suppress getrandbits usage
return random.random()
r = R()
r.randrange(2**2000) # -> OverflowError: long int too large to convert to float
b2a_bin
b2a_bin()
扩展允许直接从字节字符串创建二进制字符串(“01”),而无需创建中间 Python 整数。它比纯 Python 类似物快 3-20 倍:
def b2a_bin_bin(data):
return bin(int.from_bytes(data, 'big', signed=False)
)[2:].zfill(len(data)*8).encode('ascii', 'strict')
def b2a_bin_format(data):
n = int.from_bytes(data, 'big', signed=False)
return "{:0{}b}".format(n, len(data)*8).encode('ascii', 'strict')
用法:
>>> import os
>>> from b2a_bin import b2a_bin
>>> b2a_bin.b2a_bin(b'\x0a')
b'00001010'
>>> b2a_bin(os.urandom(5))
b'1001111011000011111001110010000101111010'