如果您需要的採樣非常大的數字,不能使用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