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