1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
|
# mode: run
# tag: cpp, cpp17
from libcpp.algorithm cimport sample
from libcpp.iterator cimport back_inserter
from libcpp.random cimport mt19937
from libcpp.utility cimport move
from libcpp.vector cimport vector
def sample_multiple(population_size, int sample_size):
"""
>>> sample = sample_multiple(10, 7)
>>> len(sample), len(set(sample)) # Check sampling without replacement.
(7, 7)
"""
cdef:
vector[int] x, y
int i
mt19937 rd = mt19937(1)
for i in range(population_size):
x.push_back(i)
sample(x.begin(), x.end(), back_inserter(y), sample_size, move(rd))
return y
def sample_single(population_size):
"""
>>> 0 <= sample_single(10) < 10
True
"""
cdef:
vector[int] x
int i
mt19937 rd = mt19937(1)
for i in range(population_size):
x.push_back(i)
sample(x.begin(), x.end(), &i, 1, move(rd))
return i
|