Python - 来自范围的随机样本,同时避免某些值

时间:2017-06-03 22:18:28

标签: python random

我一直在阅读random.sample()模块中的random函数,但没有看到解决我问题的任何内容。

我知道使用random.sample(range(1,100),5)会给我5个来自'人口'的独特样本......

我想在range(0,999)中获得一个随机数。我可以使用random.sample(range(0,999),1),但为什么我会考虑使用random.sample()

我需要该范围内的随机数与单独数组中的任何数字不匹配(例如,[443,122,738]

我可以采用相对简单的方法来做这件事吗?

另外,我对python很新,我绝对是初学者 - 如果你希望我用我可能错过的任何信息更新问题,那么我会。

编辑: 无意中说random.range()一次。糟糕。

2 个答案:

答案 0 :(得分:2)

您可以通过简单地检查数字然后将其附加到列表然后使用数字来实现这一目标。

import random

non_match = [443, 122, 738]
match = []

while len(match) < 6: # Where 6 can be replaced with how many numbers you want minus 1
    x = random.sample(range(0,999),1)
    if x not in non_match:
        match.append(x)

答案 1 :(得分:2)

主要有两种方式:

import random

def method1(lower, upper, exclude):
    choices = set(range(lower, upper + 1)) - set(exclude)
    return random.choice(list(choices))

def method2(lower, upper, exclude):
    exclude = set(exclude)
    while True:
        val = random.randint(lower, upper)
        if val not in exclude:
            return val

使用示例:

for method in method1, method2:
    for i in range(10):
        print(method(1, 5, [2, 4]))
    print('----')

输出:

1
1
5
3
1
1
3
5
5
1
----
5
3
5
1
5
3
5
3
1
3
----

对于较小的范围或较大的列表exclude,第一个更好(因此choices列表不会太大),第二个更好用于相反的(因此它不会循环太多次寻找合适的选项。)