1 //===----------------------------------------------------------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is dual licensed under the MIT and the University of Illinois Open
6 // Source Licenses. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 // <random>
11 
12 // template<class IntType = int>
13 // class discrete_distribution
14 
15 // template<class _URNG> result_type operator()(_URNG& g);
16 
17 #include <random>
18 #include <vector>
19 #include <cassert>
20 
21 int main()
22 {
23     {
24         typedef std::discrete_distribution<> D;
25         typedef std::minstd_rand G;
26         G g;
27         D d;
28         const int N = 100;
29         std::vector<D::result_type> u(d.max()+1);
30         for (int i = 0; i < N; ++i)
31         {
32             D::result_type v = d(g);
33             assert(d.min() <= v && v <= d.max());
34             u[v]++;
35         }
36         std::vector<double> prob = d.probabilities();
37         for (int i = 0; i <= d.max(); ++i)
38             assert((double)u[i]/N == prob[i]);
39     }
40     {
41         typedef std::discrete_distribution<> D;
42         typedef std::minstd_rand G;
43         G g;
44         double p0[] = {.3};
45         D d(p0, p0+1);
46         const int N = 100;
47         std::vector<D::result_type> u(d.max()+1);
48         for (int i = 0; i < N; ++i)
49         {
50             D::result_type v = d(g);
51             assert(d.min() <= v && v <= d.max());
52             u[v]++;
53         }
54         std::vector<double> prob = d.probabilities();
55         for (int i = 0; i <= d.max(); ++i)
56             assert((double)u[i]/N == prob[i]);
57     }
58     {
59         typedef std::discrete_distribution<> D;
60         typedef std::minstd_rand G;
61         G g;
62         double p0[] = {.75, .25};
63         D d(p0, p0+2);
64         const int N = 1000000;
65         std::vector<D::result_type> u(d.max()+1);
66         for (int i = 0; i < N; ++i)
67         {
68             D::result_type v = d(g);
69             assert(d.min() <= v && v <= d.max());
70             u[v]++;
71         }
72         std::vector<double> prob = d.probabilities();
73         for (int i = 0; i <= d.max(); ++i)
74             assert(std::abs((double)u[i]/N - prob[i]) / prob[i] < 0.001);
75     }
76     {
77         typedef std::discrete_distribution<> D;
78         typedef std::minstd_rand G;
79         G g;
80         double p0[] = {0, 1};
81         D d(p0, p0+2);
82         const int N = 1000000;
83         std::vector<D::result_type> u(d.max()+1);
84         for (int i = 0; i < N; ++i)
85         {
86             D::result_type v = d(g);
87             assert(d.min() <= v && v <= d.max());
88             u[v]++;
89         }
90         std::vector<double> prob = d.probabilities();
91         assert((double)u[0]/N == prob[0]);
92         assert((double)u[1]/N == prob[1]);
93     }
94     {
95         typedef std::discrete_distribution<> D;
96         typedef std::minstd_rand G;
97         G g;
98         double p0[] = {1, 0};
99         D d(p0, p0+2);
100         const int N = 1000000;
101         std::vector<D::result_type> u(d.max()+1);
102         for (int i = 0; i < N; ++i)
103         {
104             D::result_type v = d(g);
105             assert(d.min() <= v && v <= d.max());
106             u[v]++;
107         }
108         std::vector<double> prob = d.probabilities();
109         assert((double)u[0]/N == prob[0]);
110         assert((double)u[1]/N == prob[1]);
111     }
112     {
113         typedef std::discrete_distribution<> D;
114         typedef std::minstd_rand G;
115         G g;
116         double p0[] = {.3, .1, .6};
117         D d(p0, p0+3);
118         const int N = 10000000;
119         std::vector<D::result_type> u(d.max()+1);
120         for (int i = 0; i < N; ++i)
121         {
122             D::result_type v = d(g);
123             assert(d.min() <= v && v <= d.max());
124             u[v]++;
125         }
126         std::vector<double> prob = d.probabilities();
127         for (int i = 0; i <= d.max(); ++i)
128             assert(std::abs((double)u[i]/N - prob[i]) / prob[i] < 0.001);
129     }
130     {
131         typedef std::discrete_distribution<> D;
132         typedef std::minstd_rand G;
133         G g;
134         double p0[] = {0, 25, 75};
135         D d(p0, p0+3);
136         const int N = 1000000;
137         std::vector<D::result_type> u(d.max()+1);
138         for (int i = 0; i < N; ++i)
139         {
140             D::result_type v = d(g);
141             assert(d.min() <= v && v <= d.max());
142             u[v]++;
143         }
144         std::vector<double> prob = d.probabilities();
145         for (int i = 0; i <= d.max(); ++i)
146             if (prob[i] != 0)
147                 assert(std::abs((double)u[i]/N - prob[i]) / prob[i] < 0.001);
148             else
149                 assert(u[i] == 0);
150     }
151     {
152         typedef std::discrete_distribution<> D;
153         typedef std::minstd_rand G;
154         G g;
155         double p0[] = {25, 0, 75};
156         D d(p0, p0+3);
157         const int N = 1000000;
158         std::vector<D::result_type> u(d.max()+1);
159         for (int i = 0; i < N; ++i)
160         {
161             D::result_type v = d(g);
162             assert(d.min() <= v && v <= d.max());
163             u[v]++;
164         }
165         std::vector<double> prob = d.probabilities();
166         for (int i = 0; i <= d.max(); ++i)
167             if (prob[i] != 0)
168                 assert(std::abs((double)u[i]/N - prob[i]) / prob[i] < 0.001);
169             else
170                 assert(u[i] == 0);
171     }
172     {
173         typedef std::discrete_distribution<> D;
174         typedef std::minstd_rand G;
175         G g;
176         double p0[] = {25, 75, 0};
177         D d(p0, p0+3);
178         const int N = 1000000;
179         std::vector<D::result_type> u(d.max()+1);
180         for (int i = 0; i < N; ++i)
181         {
182             D::result_type v = d(g);
183             assert(d.min() <= v && v <= d.max());
184             u[v]++;
185         }
186         std::vector<double> prob = d.probabilities();
187         for (int i = 0; i <= d.max(); ++i)
188             if (prob[i] != 0)
189                 assert(std::abs((double)u[i]/N - prob[i]) / prob[i] < 0.001);
190             else
191                 assert(u[i] == 0);
192     }
193     {
194         typedef std::discrete_distribution<> D;
195         typedef std::minstd_rand G;
196         G g;
197         double p0[] = {0, 0, 1};
198         D d(p0, p0+3);
199         const int N = 100;
200         std::vector<D::result_type> u(d.max()+1);
201         for (int i = 0; i < N; ++i)
202         {
203             D::result_type v = d(g);
204             assert(d.min() <= v && v <= d.max());
205             u[v]++;
206         }
207         std::vector<double> prob = d.probabilities();
208         for (int i = 0; i <= d.max(); ++i)
209             if (prob[i] != 0)
210                 assert(std::abs((double)u[i]/N - prob[i]) / prob[i] < 0.001);
211             else
212                 assert(u[i] == 0);
213     }
214     {
215         typedef std::discrete_distribution<> D;
216         typedef std::minstd_rand G;
217         G g;
218         double p0[] = {0, 1, 0};
219         D d(p0, p0+3);
220         const int N = 100;
221         std::vector<D::result_type> u(d.max()+1);
222         for (int i = 0; i < N; ++i)
223         {
224             D::result_type v = d(g);
225             assert(d.min() <= v && v <= d.max());
226             u[v]++;
227         }
228         std::vector<double> prob = d.probabilities();
229         for (int i = 0; i <= d.max(); ++i)
230             if (prob[i] != 0)
231                 assert(std::abs((double)u[i]/N - prob[i]) / prob[i] < 0.001);
232             else
233                 assert(u[i] == 0);
234     }
235     {
236         typedef std::discrete_distribution<> D;
237         typedef std::minstd_rand G;
238         G g;
239         double p0[] = {1, 0, 0};
240         D d(p0, p0+3);
241         const int N = 100;
242         std::vector<D::result_type> u(d.max()+1);
243         for (int i = 0; i < N; ++i)
244         {
245             D::result_type v = d(g);
246             assert(d.min() <= v && v <= d.max());
247             u[v]++;
248         }
249         std::vector<double> prob = d.probabilities();
250         for (int i = 0; i <= d.max(); ++i)
251             if (prob[i] != 0)
252                 assert(std::abs((double)u[i]/N - prob[i]) / prob[i] < 0.001);
253             else
254                 assert(u[i] == 0);
255     }
256     {
257         typedef std::discrete_distribution<> D;
258         typedef std::minstd_rand G;
259         G g;
260         double p0[] = {33, 0, 0, 67};
261         D d(p0, p0+3);
262         const int N = 1000000;
263         std::vector<D::result_type> u(d.max()+1);
264         for (int i = 0; i < N; ++i)
265         {
266             D::result_type v = d(g);
267             assert(d.min() <= v && v <= d.max());
268             u[v]++;
269         }
270         std::vector<double> prob = d.probabilities();
271         for (int i = 0; i <= d.max(); ++i)
272             if (prob[i] != 0)
273                 assert(std::abs((double)u[i]/N - prob[i]) / prob[i] < 0.001);
274             else
275                 assert(u[i] == 0);
276     }
277 }
278