Python:给定一组 N 个元素,随机选择 k,m 次

ntg*_*ntg 5 python permutation

给定一组 N 个元素,我想选择 k 个元素的 m 个随机、非重复子集。

如果我想生成所有的 N 个选择 k 组合,我可以使用itertools.combination,所以我要求的一种方法是:

import numpy as np
import itertools
n=10
A = np.arange(n)
k=4
m=5
result = np.random.permutation([x for x in itertools.permutations(A,k)])[:m]
print(result)
Run Code Online (Sandbox Code Playgroud)

问题当然是这段代码首先生成所有可能的排列,这可能非常昂贵。

另一个次优解决方案是每次随机选择单个排列(例如,选择随机组合,然后排序以获得排列),如果已经被选择则丢弃它。

有一个更好的方法吗?

Thi*_*lle 3

您的第二个解决方案似乎是唯一可行的方法。除非 k 接近 n 并且 m “大”,否则它会很好地工作,在这种情况下将会有更多的重复。

我添加了获得我们需要的样本所需的尝试次数。对于 m=50、n=10 且 k=4,通常需要不到 60 次尝试。您可以看到它与您的人口规模和样本的大小有何关系。

您可以使用random.sample获取 k 个值的列表(无需替换),然后对其进行排序并将其转换为元组。因此,我们可以使用 aset来仅保留唯一的结果。

import random

n = 10
A = list(range(n))
k = 4
m = 5

samples = set()
tries = 0
while len(samples) < m:
    samples.add(tuple(sorted(random.sample(A, k))))
    tries += 1

print(samples)
print(tries)

# {(1, 4, 5, 9), (0, 3, 6, 8), (0, 4, 7, 8), (3, 5, 7, 9), (1, 2, 3, 4)}
# 6
# 6 tries this time !
Run Code Online (Sandbox Code Playgroud)