PYTHON如何生成2000万个不可重复的随机数

PYTHON如何生成2000万个不可重复的随机数,python,multithreading,numpy,multiprocessing,Python,Multithreading,Numpy,Multiprocessing,需要生成2000万个长度为8个字符的不可重复随机数,并将其保存在数组中。 我尝试多处理,线程,但它保持缓慢 尝试使用多处理: from numpy.random import default_rng from multiprocessing import Process,Queue import os,time import numpy as np rng = default_rng() f=np.array([],dtype=np.int64) def generate(q,start,sto

需要生成2000万个长度为8个字符的不可重复随机数,并将其保存在数组中。 我尝试多处理,线程,但它保持缓慢

尝试使用多处理:

from numpy.random import default_rng
from multiprocessing import Process,Queue
import os,time
import numpy as np
rng = default_rng()
f=np.array([],dtype=np.int64)
def generate(q,start,stop):    
    numbers=[rng.choice(range(start,stop),replace=False) for _ in range(1000)]    
    q.put(numbers)       

if __name__ == '__main__':
    timeInit = time.time()
    for x in range(20000):
        q=Queue()
        p = Process(target=generate,args=(q,11111111,99999999,))    
        p.start()        
        f=np.append(f,q.get())
        p.join()
    print(f)
    timeStop = time.time()
    print('[TIME EXECUTED] ' + str(timeStop-timeInit) +' segs')
 

这在我的个人笔记本电脑上只花了不到30秒的时间,如果它适合您的话:

随机导入
候选者=列表(范围(10**7,10**8)#从10000000到9999999的所有数字
随机。随机(候选)
结果=候选人[:20*10**6]#获得前2000万

您还没有解释为什么要这么做。我只是从候选人编号中随机抽取了一个样本:

from random import sample

result = sample(
    list(range(10**7, 10**8)),
    2*10**7
)
在我的笔记本电脑上51秒,受到其他工作的干扰



我只是在这两种解决方案上运行了一个更具控制性的测试。这个帖子里的那个用了48.5秒;来自naicolas的那张花了81.6秒,可能是因为额外创建了列表。

我希望我明白了你的想法。您试图生成的随机数实际上有点棘手。基本上,我们正在寻找一组唯一的(不可重复)但随机数。在这种情况下,我们不能从均匀分布中抽取随机数,因为不能保证数字是唯一的

有两种可能的算法。第一种方法是生成大量可能的随机数,并删除那些重复的随机数。比如说,

将numpy导入为np
N=20_000_000
L0=11_111_111#Python中的合法int
L1=L0*9
不够独特=正确
虽然不够独特,但:
X=np.random.uniform(L0,L1,int(N*2)).astype(int)
X_unique=np.unique(X)#删除重复的数字
不够唯一=len(X唯一)
还有另一种更“物理”的方法。我们可以从等距数字开始,将每个数字移动一点。结果将不会像第一个那样随机,但它要快得多,而且纯粹有趣

将numpy导入为np
N=20_000_000
L0=11_111_111#Python中的合法int
L1=L0*9
lattice=np.linspace(L0,L1,N)#所有数字的间距都相等
pertubation=np.random.normal(0,0.4,N)#每个数字都会左右移动一点
随机数=(点阵+扰动)。aType(int)
#检查两个连续数字之间的最小距离
#即所有数字都是唯一的
min_dist=np.abs(np.diff(随机数)).min()
打印(f“生成最小间隔为{min_dist}的随机数”)
打印(“(如果大于1,则为良好)”)
np.random.shuffle(随机数)

(这两种算法在我的笔记本电脑上10秒内生成结果)

什么是“不可重复”的随机数?你的意思是你需要2000万个唯一的数字吗?请完成你的问题描述。用你的话来说,什么是“慢”?如果您担心速度,为什么要用这么多的开销来阻碍流程?为什么您的数字从11111111开始,而不是10000000?你不想让你的结果包括所有可能的8位数字吗?@Prune没错,显然它们不能是连续的数字。。我需要像[3821456713821593,…]@Prune这样的东西。它的速度很慢,以至于我看不到输出。这就是为什么我决定使用多重处理,这样就不会把所有的工作都留给主进程。这仍然是Python 2代码吗?更正了,我的错误!它可以工作,但在我的个人笔记本电脑上仍然很慢。