<p>衡量它是否足够快,以你的目的,“随机性”可能会减少你称之为:<a href="http://docs.python.org/library/os.html#os.urandom" rel="nofollow">^{<cd1>}</a>。它产生一个二进制字符串aka bytes。在</p>
<p>为了避免“long int too large To convert To float”错误,不要使用float。在</p>
<p>如果需要一个带有<code>k</code>随机位的整数而不是二进制字符串:</p>
<pre><code>import random
r = random.SystemRandom()
n = r.getrandbits(2000) # uses os.urandom() under the hood
</code></pre>
<p>要获取字符串“0”和“1”,请执行以下操作:</p>
^{pr2}$
<p>注意:如果不使用<code>getrandbits</code>,则不能将<code>randint/randrange</code>用于大数:</p>
<pre><code>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
</code></pre>
<h2>b2a逯宾</h2>
<p><a href="https://gist.github.com/3526111" rel="nofollow">^{<cd5>} extension</a>允许直接从bytestrings创建二进制字符串(“01”),而无需创建中间的Python整数。它比纯Python类似物快3-20倍:</p>
<pre><code>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')
</code></pre>
<p>用法:</p>
<pre><code>>>> import os
>>> from b2a_bin import b2a_bin
>>> b2a_bin.b2a_bin(b'\x0a')
b'00001010'
>>> b2a_bin(os.urandom(5))
b'1001111011000011111001110010000101111010'
</code></pre>