… | |
… | |
36 | template<int N, typename T = uint8_t> |
36 | template<int N, typename T = uint8_t> |
37 | struct permutation |
37 | struct permutation |
38 | { |
38 | { |
39 | T pmap[N]; |
39 | T pmap[N]; |
40 | |
40 | |
41 | template<class generator> |
41 | template<class random_generator> |
42 | void seed (generator &rng) |
42 | void seed (random_generator &rng); |
43 | { |
|
|
44 | for (int i = 0; i < N; ++i) |
|
|
45 | pmap[i] = i; |
|
|
46 | |
|
|
47 | // fisher-yates to randomly perturb |
|
|
48 | for (int i = N; --i; ) |
|
|
49 | ::swap (pmap[i], pmap[rng (i + 1)]); |
|
|
50 | } |
|
|
51 | |
43 | |
52 | T operator ()(T v) |
44 | T operator ()(T v) |
53 | { |
45 | { |
54 | return pmap[v & (N - 1)]; |
46 | return pmap[v & (N - 1)]; |
55 | } |
47 | } |