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
|