生成可种子数据的随机字符串

Wil*_*ill 5 python random

我正在寻找一种在 Python 中以类似于方法的方式生成n个字节的随机字符串的os.urandom()方法,除了提供一种为数据生成提供种子的方法。

到目前为止,我有:

def genRandData(size):
    buf = chr(random.randint(0,255))
    for i in range(size-1):
        buf = buf + chr(random.randint(0,255))
    return str(buf)
Run Code Online (Sandbox Code Playgroud)

但是这个功能很慢,在我的机器上生成一兆字节的数据大约需要 1.8 秒。有什么方法可以改进这个(或者是一种播种 os.urandom 的方法)。

cri*_*mtr 3

新答案

\n\n

重新阅读OP的问题后,我现在明白它是关于原始字节,而不是ascii字符字符串

\n\n

那么,这个怎么样?

\n\n
import random\ngl = 0\ndef randBytes(size):\n    global gl\n    nr = bytearray(random.getrandbits(8) for _ in xrange(size))\n    gl = nr\n    return\n\n%timeit randBytes(1000000)\n1 loops, best of 3: 262 ms per loop\n\nIn [27]: gl.__sizeof__()\nOut[27]: 1087223\n
Run Code Online (Sandbox Code Playgroud)\n\n

旧答案在这里

\n\n
import random\nimport string\ndef generateRandomString(size):\n    return(\'\'.join(random.choice(string.ascii_letters) for i in range(size)))\n
Run Code Online (Sandbox Code Playgroud)\n\n

笔记:

\n\n

1 个 ascii 字符为 1 个字节。所以“size”既表示字符串的长度又表示字节大小。

\n\n

您可以使用 string.ascii_uppercase 或 ascii_lowercase 来获得小写和大写

\n\n

random.seed 可用于指定种子。

\n\n
\n

随机.seed([x])\xc2\xb6

\n\n

初始化基本随机数生成器。可选参数 x 可以是任何可散列对象。如果省略 x 或 None,则使用当前系统时间;当模块首次导入时,当前系统时间也用于初始化生成器。如果操作系统提供随机源,则使用它们而不是系统时间(有关可用性的详细信息,请参阅 os.urandom() 函数)。

\n
\n\n

所以你可以:

\n\n
    import random\n    import string\n    def generateRandomString(size, seed=None):\n        if seed != None:\n             random.seed(seed)\n        return(\'\'.join(random.choice(string.ascii_letters) for i in range(size)))\n
Run Code Online (Sandbox Code Playgroud)\n\n

时间:

\n\n
In [30]: %time generateRandomString(1000000)\nWall time: 554 ms\n<and then output>\n
Run Code Online (Sandbox Code Playgroud)\n