Random numpy中的非重复随机数

Random numpy中的非重复随机数,random,numpy,numbers,non-repetitive,Random,Numpy,Numbers,Non Repetitive,如何在numpy中生成非重复随机数 list = np.random.random_integers(20,size=(10)) 只需生成一个包含所需数字范围的数组,然后通过重复将随机数与数组中的第0个元素交换来洗牌。这将生成一个不包含重复值的随机序列。提供了一个replace参数,用于在不进行替换的情况下采样: from numpy.random import default_rng rng = default_rng() numbers = rng.choice(20, size=10,

如何在numpy中生成非重复随机数

list = np.random.random_integers(20,size=(10))

只需生成一个包含所需数字范围的数组,然后通过重复将随机数与数组中的第0个元素交换来洗牌。这将生成一个不包含重复值的随机序列。

提供了一个
replace
参数,用于在不进行替换的情况下采样:

from numpy.random import default_rng

rng = default_rng()
numbers = rng.choice(20, size=10, replace=False)
如果您使用的是1.17 NumPy之前的版本,没有
生成器
API,则可以从标准库使用:

print(random.sample(range(20), 10))
您还可以使用
numpy.random.shuffle()
和切片,但这会降低效率:

a = numpy.arange(20)
numpy.random.shuffle(a)
print a[:10]

在遗留的
numpy.random.choice
函数中还有一个
replace
参数,但是该参数的实现效率很低,然后由于随机数流稳定性的保证而变得很低,因此不建议使用它。(它基本上在内部进行洗牌和切片。)

几年后,从10000^2中选择40000的时间到了 (Numpy 1.8.1,imac 2.7 GHz):

(为什么在10000^2中选择40000? 产生大量 矩阵——scipy 1.4.1使用
np.random.choice(replace=False)
,slooow.)


向numpy.random的人们致敬。

我认为
numpy.random.sample
现在不起作用。这是我的方式:

import numpy as np
np.random.choice(range(20), 10, replace=False)

您也可以通过排序来获得:

random_numbers = np.random.random([num_samples, max_int])
samples = np.argsort(random_numbers, axis=1)

可以使用Python集合列表转换。10个介于0和20之间的随机非重复数字可以如下所示:

import random
numbers=set()
while(len(numbers)<10):
    numbers.add(random.randint(0,20))

numbers=list(numbers)
random.shuffle(numbers)
print(numbers)
随机导入
数字=集合()

你说的“不重复”是什么意思?随机数序列永远不会递归?这是不可能的,因为随机数生成器的状态需要放入计算机的有限内存中。或者你的意思是没有一个数字出现两次?不重复意味着你有一个没有重复的列表。也许你需要一个随机排列?随机数生成器的另一个属性是结果是随机序列。@SvenMarnach-但在大多数情况下,它已经足够随机了。如果他想要更随机的话,他可以使用双随机方法。这是毫无意义的。OP可以使用库调用来做正确的事情。它们比自定义版本更容易使用,运行速度更快,可读性更强。我想不出我为什么要这样做d在这里使用错误的算法只是因为它可能是“足够随机的”,而使用正确的算法没有任何缺点。@SvenMarnach-足够公平。我不知道numpy,所以我只是提供了一个潜在的解决方案。print random.sample(范围(20),10)python 2.6不起作用?!问题是由于Pydev配置不正确。如果我的n不是20,而是1000000,但我只需要其中的10个唯一数字,有没有更节省内存的方法?@mrglud在python 3中,
random.sample(范围(n),10))
即使对于非常大的
n
,也会有效,因为
范围
对象只是一个存储开始、停止和步骤值的小包装器,但并不创建完整的整数列表。在Python 2中,可以将
range
替换为
xrange
,以获得类似的行为。而不是将
range(n)
(或
arange(n)
)作为
choice
的第一个参数,它相当于只传递
n
,例如
choice(20,10,replace=False)
。注意
np.random.choice>(a,size,replace=False)
对于大型
a
,速度非常慢-在我的机器上,对于a=1M,速度大约为30毫秒。要避免对于大型
n
的时间和内存问题,请使用
numpy.random.Generator.choice
(从numpy v1.17开始)我看到的主要缺点是np.random.choice没有轴参数->它仅适用于1d阵列。
import random
numbers=set()
while(len(numbers)<10):
    numbers.add(random.randint(0,20))

numbers=list(numbers)
random.shuffle(numbers)
print(numbers)