summaryrefslogtreecommitdiff
path: root/tests/run/cpp_stl_algo_sample.pyx
blob: 4bc939049c686240a9a1b6fae46263e294e2ca1a (plain)
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