<p>我喜欢直接使用随机发生器。虽然python的random模块相当不错,但对于其他语言,我遇到了一些问题,例如,在多维空间中生成点时,出现了一些模式</p>
<p>Python支持从基数为36的数字转换为十进制整数。因此,要约束最小值,请将字符串转换为整数并使用user<em>randint</em>,这很容易支持间隔</p>
<p>将常规的基10整数转换为基36更为复杂,幸运的是,您可以使用从<a href="https://code.activestate.com/recipes/65212/" rel="nofollow noreferrer">https://code.activestate.com/recipes/65212/</a>剪切的附加库,例如或numpy或活动状态。我只是从一个旧的stackoverflow答案中复制了一个被剪掉的,它被讨论了很多次,并且比ActiveState更紧凑</p>
<pre><code>import string
import random
alphabet = string.digits + string.ascii_uppercase
N = len(alphabet) # 36
MAX1 = int('0000WXYZ', N) + 1
MAX2 = int('ZZZZZZZZ', N)
digs = alphabet
def int2base(x, base):
digits = []
while x:
digits.append(digs[int(x % base)])
x = int(x / base)
digits.reverse()
return ''.join(digits)
r = int2base(random.randint(MAX1, MAX2), N)
if len(r) < 8: # pad with 0 if needed
r = rjust(r, '0')
</code></pre>
<p>免责声明。python随机数生成器非常好,但它是可能的,因为只有这么多长度为8的唯一字符串。我运行了一些测试,通常需要10万到几百万的时间。即使是一个真正的随机数,你也可以得到任何东西,即使是重复的,只要试着掷硬币或掷骰子几次就行了。请注意,每次更新最大值并不是一个好主意,因为您将用尽列表并很快达到zzzz(可能不到30)。如果您觉得必须100%防止重复,只需构建一个已使用字符串的列表/集合,但这是极不可能的,除非MAX接近zzzz</p>