如果您需要的采样非常大的数字,不能使用range
random.sample(range(10000000000000000000000000000000), 10)
,因为它抛出:
OverflowError: Python int too large to convert to C ssize_t
另外,如果random.sample
不能产生想要的项目数由于范围太小
random.sample(range(2), 1000)
它抛出:
ValueError: Sample larger than population
此功能解决两个问题:
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))))]
中的用法非常大的数字:
print('\n'.join(map(str, random_sample(10, 2, 10000000000000000000000000000000))))
样品结果:
7822019936001013053229712669368
6289033704329783896566642145909
2473484300603494430244265004275
5842266362922067540967510912174
6775107889200427514968714189847
9674137095837778645652621150351
9969632214348349234653730196586
1397846105816635294077965449171
3911263633583030536971422042360
9864578596169364050929858013943
使用其中的范围比要求的项目数量较小:
print(', '.join(map(str, random_sample(100000, 0, 3))))
样品结果:
2, 0, 1
它还可以与负范围和步骤:
print(', '.join(map(str, random_sample(10, 10, -10, -2))))
print(', '.join(map(str, random_sample(10, 5, -5, -2))))
样品结果:
2, -8, 6, -2, -4, 0, 4, 10, -6, 8
-3, 1, 5, -1, 3
如果他们是独特的,那么他们并不是真正的随机。 – 2012-03-18 02:38:06
@ IgnacioVazquez-Abrams im试图实施一种方法我的教授称为“bootstrapping”,我们正在搜索引擎上做一些“研究”。 – iCodeLikeImDrunk 2012-03-18 02:47:32
@ IgnacioVazquez-Abrams他们是如果他们代表随机选择而不替换。这是一个关于一般使用的编程语言的问题......我们使用*它的东西 – 2016-02-04 21:34:38