我正在寻找一种在 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 的方法)。
新答案
\n\n重新阅读OP的问题后,我现在明白它是关于原始字节,而不是ascii字符字符串
\n\n那么,这个怎么样?
\n\nimport 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\nRun Code Online (Sandbox Code Playgroud)\n\n旧答案在这里
\n\nimport random\nimport string\ndef generateRandomString(size):\n return(\'\'.join(random.choice(string.ascii_letters) for i in range(size)))\nRun Code Online (Sandbox Code Playgroud)\n\n笔记:
\n\n1 个 ascii 字符为 1 个字节。所以“size”既表示字符串的长度又表示字节大小。
\n\n您可以使用 string.ascii_uppercase 或 ascii_lowercase 来获得小写和大写
\n\nrandom.seed 可用于指定种子。
\n\n\n\n\n随机.seed([x])\xc2\xb6
\n\n初始化基本随机数生成器。可选参数 x 可以是任何可散列对象。如果省略 x 或 None,则使用当前系统时间;当模块首次导入时,当前系统时间也用于初始化生成器。如果操作系统提供随机源,则使用它们而不是系统时间(有关可用性的详细信息,请参阅 os.urandom() 函数)。
\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)))\nRun Code Online (Sandbox Code Playgroud)\n\n时间:
\n\nIn [30]: %time generateRandomString(1000000)\nWall time: 554 ms\n<and then output>\nRun Code Online (Sandbox Code Playgroud)\n