Skip to main content
 首页 » 编程设计

python之将一个巨大的数字乘以 random() (Python)

2025年05月04日15mq0036

问题: 生成大型二进制字符串(长度超过 2000)。 Action 要快,因为这个 generateRandom() 函数将在算法中被调用 300,000 次。

尝试的解决方案:生成 3 或 4 个二进制数并将它们全部附加在一起 ​​500 次。这太慢了。

调用 random.random() 并将其乘以一个巨大的数字。一次转换为二进制并完成。这适用于较小的数字,但由于二进制字符串必须具有一定长度,因此转换为二进制的数字必须非常巨大 (2 ** len(binString))。

当前代码(适用于较小的数字):

binaryRepresentation = '' 
 
binaryRepresentation += bin(int(random.random() * (2 ** binLength)))[2:].zfill(binLength) 

我需要帮助修复的错误: 此调用会抛出一个带有大数字的“long int too large to convert to float”。有没有办法使整个算法更高效或使这个大数字可转换为 float ?

谢谢!

请您参考如下方法:

衡量它是否足够快以达到您的目的,“随机性”可能会随着您调用它的次数而减少:os.urandom(250) .它产生一个二进制字符串,也称为字节。

为避免“long int too large to convert to float”错误,请勿使用 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) 

注意:如果未使用 getrandbits,则不能对大数使用 randint/randrange:

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() extension允许直接从字节串创建二进制字符串(“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'