对于我正在编写的包,我需要0到2**33之间的随机数字。最初,我尝试使用如下生成器:
def randomnumber(NUM):
List = [i for i in range(NUM)]
List.shuffle()
index = 0
while index < NUM:
index += 1
yield List[index-1]
但是在我的情况下,由于NUM是2**33,所以这个代码是不可能的。我试着把所有的数字都写进bash的一个文本文件中,发现这个文件的大小是93.6 GB(这真的很大,远远超过了我的RAM(。然后,我使用terashuf打乱文件的内容,并使用linecache
读取其中的每一行。
此外,我正在使用多处理模块(尤其是apply_async(,并且确实需要将此生成器对象作为参数传递。但python给出了一个错误,指出它不能在池进程中使用生成器对象。我讨论了几个关于SO的问题,它的答案之一是从生成器中为几个数字创建一个这些数字的列表,并将它们作为参数传递给并行运行的函数,但这也不起作用。
因此,我的问题是,我们有没有任何方法可以创建一个生成器来完成预期的工作(给出0和2**33之间的随机唯一数(,或者其他方法来做到这一点,因为我不想一次又一次地打乱文件的内容(需要相当长的时间(
据我所知,代码的要点是生成0
和NUM
之间的随机整数。在你的例子中,NUM
将是2**33
。
以下代码可以做到这一点,您可以毫无问题地更改NUM
:
import math
import random
def generate_random(num):
yield random.randint(0, num)
#setting seed to get consistent results
random.seed(0)
# Now, let's use this simple function to generate
# 5 different random number between `0` and `2**33`:
NUM = math.pow(2, 33)
for i in range(10):
print(next(generate_random(NUM)))
# This would print these five numbers
# 7921731533
# 1806341205
# 6490875490
# 6341935620
# 3900315155