如何从0-30的列表中无放回均匀随机抽取m个元素?
无放回均匀抽取整数样本的实现方案
你用random.uniform()的思路不对,这个函数的作用是生成指定区间内的浮点型随机数,完全不匹配你从整数序列里无放回抽样的需求。下面给你两种直接可行的方法:
方法一:使用random.sample()(推荐)
这是Python标准库专门为无放回抽样设计的方法,默认就是均匀分布,用法简单高效:
import random arr = range(0, 30) m = 5 # 替换成你需要抽取的样本数量 sample_result = random.sample(arr, m) print(sample_result)
random.sample(population, k)会从population中随机选出k个不重复的元素,每个元素被选中的概率均等,完美符合你的要求。而且它不需要把整个range转成列表,对内存更友好。
方法二:先打乱序列再截取前m个
如果需要先打乱整个序列再取样本,可以用random.shuffle(),但注意range是不可变对象,需要先转成列表:
import random arr = list(range(0, 30)) m = 5 random.shuffle(arr) sample_result = arr[:m] print(sample_result)
这种方法的效果和random.sample()一致,但如果你的序列非常大,shuffle会占用更多内存(因为要处理整个列表),所以优先推荐第一种方法。
内容的提问来源于stack exchange,提问作者merkle
相关产品推荐
相关产品推荐

