繁体   English   中英

如何在 Python 上生成大量随机数而不会发生冲突?

[英]How can I generate a large set of random numbers without collision on Python?

从我的 class 项目中,我发现创建一组随机数和创建一个新的随机数时遇到了一些困难,如果可能的话,不会发生任何冲突。

我已经尝试过这个程序

import random

def random_sample(count, start, stop, step=1):
    def gen_random():
        while True:
            yield random.randrange(start, stop, step)

    def gen_n_unique(source, n):
        seen = set()
        seenadd = seen.add
        for i in (i for i in source() if i not in seen and not seenadd(i)):
            yield i
            if len(seen) == n:
                break

    return [i for i in gen_n_unique(gen_random,
                                    min(count, int(abs(stop - start) / abs(step))))]

您可以创建一个空列表,然后填充它,检查该号码是否已经在列表中:

random_list = []
while len(random_list) < N:
    number = random.randrange(start, stop, step)
    if not number in random_list:
        random_list.append(number)
print(random_list)

作为N,列表中必须有多少个数字。

选项1

试试这个方法在lowerupper之间生成一个随机int

import random

def rand_int(lower, upper):
     return random.randint(lower, upper)

Output:

>>> rand_int(1,1000)
432
>>> rand_int(1,1000)
718

然后将其用作列表的一部分并在您的代码中进行检查以查看该值是否已存在。

>>> a = [rand_int(1,10), rand_int(1,11), rand_int(1,17)]
>>> a
[6, 10, 14]

选项 2

使用numpymath模块,我观察到为一个小样本生成了一个唯一列表,如下所示。

import numpy as np
import math

x = np.random.rand(5)
for i in range(len(x)):
     print(math.floor(x[i]*100))

Output:

95
55
67
71
68 

您可以创建一个空set ,然后填充它检查长度是否正确:

def random_sample(count, start, stop, step=1):
    random_list = set()
    
    while len(random_list) < count:
        random_list.add(random.randrange(start, stop, step))
    return list(random_list)

print(random_sample(count, start, stop, step))

请注意,对于某些参数组合,此代码将进入无限循环。 即,如果您要求的数量超过范围内的数量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM