【发布时间】:2012-08-23 02:55:47
【问题描述】:
问题:生成较大的二进制字符串(长度 2000+)。赶快行动吧,因为这个 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”。有没有办法让整个算法更高效,或者让这个大数可以转换为浮点数?
谢谢!
【问题讨论】:
-
binLength的值是多少? -
@brianbuck:任何超过 1023 的都太大了,OP 正在寻找 2000+。
-
将浮点数乘以某个大数的方法不是一个好策略。大数的位数比浮点数可表示的位数多得多,因此您不会随机化所有位数。如果要使用
bin函数将大整数转换为“位字符串”,请使用random.randint而不是random.random。只需bin(random.randint(0, 2**binLength)[2:].zfill(binLength)。 -
@JohnY: 如果
getrandbits()不使用example,randint()将产生溢出。 -
@J.F.Sebastian:看来旧版本的 Python 在
randint/randrange中不一定使用getrandbits。所以是的,可以肯定的是,只需使用getrandbits(我忽略了它,因为我自己从来没有这个用例)。
标签: python optimization largenumber