-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathcpp11random.cpp
More file actions
51 lines (44 loc) · 2.45 KB
/
cpp11random.cpp
File metadata and controls
51 lines (44 loc) · 2.45 KB
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
42
43
44
45
46
47
48
49
50
51
#include <iostream>
#include <random>
#include <iomanip>
#include <map>
using namespace std;
int main() {
// Генератор "случайных" чисел, реализация зависит от системы.
// Т.е. физический, т.е используются, грубо говоря, шумы в проводах компьютера.
// На некоторых платформах может быть нереализован,
// т.е. возвращать неслучайные числа.
// Генерация СЧ физически -- долгая операция.
random_device rd;
// Если хотим воспроизводимости при нескольких запусках программы,
// выставляем в seed просто некое число.
random_device::result_type seed = rd();
// Генератор псевдослучайных чисел. Реализаций ГПСЧ в stl несколько.
// Значение из random_device используется в качестве начального
// значения (seed) для псевдослучайного генератора.
// А имея начальное "случайное" значение, можно по нему
// быстро генерировать псевдослучайную последовательность.
mt19937 prd(seed);
// А из сгенерированных (псевдо)случайных последовательностей
// можно собирать любое нужное распределение.
// Целые числа от 2 до 7 равновероятно.
// А вот так делать не надо: "2 + unifInts(prd) % 6" --
// не совсем равновероятно, менее эффективно и др.
uniform_int_distribution<int> unifInts(2, 7);
for (int i = 0; i < 20; ++i) {
cout << unifInts(prd) << " ";
}
cout << endl;
// Гаусс с гистограммой
normal_distribution<double> gauss(5, 2);
map<int, int> hist;
for (int n = 0; n < 10000; ++n) {
++hist[round(gauss(prd))];
}
for (pair<int, int> p : hist) {
cout << fixed << setprecision(1) << setw(2)
<< p.first << ' ' << string(p.second / 200, '*') << endl;
}
// ... (http://en.cppreference.com/w/cpp/numeric/random)
return 0;
}