1 //===----------------------------------------------------------------------===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 // REQUIRES: long_tests
13 // template<class RealType = double>
14 // class uniform_real_distribution
16 // template<class _URNG> result_type operator()(_URNG& g);
25 #include "test_macros.h"
38 typedef std::uniform_real_distribution
<> D
;
39 typedef std::minstd_rand0 G
;
43 std::vector
<D::result_type
> u
;
44 for (int i
= 0; i
< N
; ++i
)
46 D::result_type v
= d(g
);
47 assert(d
.a() <= v
&& v
< d
.b());
50 D::result_type mean
= std::accumulate(u
.begin(), u
.end(),
51 D::result_type(0)) / u
.size();
52 D::result_type var
= 0;
53 D::result_type skew
= 0;
54 D::result_type kurtosis
= 0;
55 for (std::size_t i
= 0; i
< u
.size(); ++i
)
57 D::result_type dbl
= (u
[i
] - mean
);
58 D::result_type d2
= sqr(dbl
);
64 D::result_type dev
= std::sqrt(var
);
65 skew
/= u
.size() * dev
* var
;
66 kurtosis
/= u
.size() * var
* var
;
68 D::result_type x_mean
= (d
.a() + d
.b()) / 2;
69 D::result_type x_var
= sqr(d
.b() - d
.a()) / 12;
70 D::result_type x_skew
= 0;
71 D::result_type x_kurtosis
= -6./5;
72 assert(std::abs((mean
- x_mean
) / x_mean
) < 0.01);
73 assert(std::abs((var
- x_var
) / x_var
) < 0.01);
74 assert(std::abs(skew
- x_skew
) < 0.01);
75 assert(std::abs((kurtosis
- x_kurtosis
) / x_kurtosis
) < 0.01);
78 typedef std::uniform_real_distribution
<> D
;
79 typedef std::minstd_rand G
;
83 std::vector
<D::result_type
> u
;
84 for (int i
= 0; i
< N
; ++i
)
86 D::result_type v
= d(g
);
87 assert(d
.a() <= v
&& v
< d
.b());
90 D::result_type mean
= std::accumulate(u
.begin(), u
.end(),
91 D::result_type(0)) / u
.size();
92 D::result_type var
= 0;
93 D::result_type skew
= 0;
94 D::result_type kurtosis
= 0;
95 for (std::size_t i
= 0; i
< u
.size(); ++i
)
97 D::result_type dbl
= (u
[i
] - mean
);
98 D::result_type d2
= sqr(dbl
);
104 D::result_type dev
= std::sqrt(var
);
105 skew
/= u
.size() * dev
* var
;
106 kurtosis
/= u
.size() * var
* var
;
108 D::result_type x_mean
= (d
.a() + d
.b()) / 2;
109 D::result_type x_var
= sqr(d
.b() - d
.a()) / 12;
110 D::result_type x_skew
= 0;
111 D::result_type x_kurtosis
= -6./5;
112 assert(std::abs((mean
- x_mean
) / x_mean
) < 0.01);
113 assert(std::abs((var
- x_var
) / x_var
) < 0.01);
114 assert(std::abs(skew
- x_skew
) < 0.01);
115 assert(std::abs((kurtosis
- x_kurtosis
) / x_kurtosis
) < 0.01);
118 typedef std::uniform_real_distribution
<> D
;
119 typedef std::mt19937 G
;
122 const int N
= 100000;
123 std::vector
<D::result_type
> u
;
124 for (int i
= 0; i
< N
; ++i
)
126 D::result_type v
= d(g
);
127 assert(d
.a() <= v
&& v
< d
.b());
130 D::result_type mean
= std::accumulate(u
.begin(), u
.end(),
131 D::result_type(0)) / u
.size();
132 D::result_type var
= 0;
133 D::result_type skew
= 0;
134 D::result_type kurtosis
= 0;
135 for (std::size_t i
= 0; i
< u
.size(); ++i
)
137 D::result_type dbl
= (u
[i
] - mean
);
138 D::result_type d2
= sqr(dbl
);
144 D::result_type dev
= std::sqrt(var
);
145 skew
/= u
.size() * dev
* var
;
146 kurtosis
/= u
.size() * var
* var
;
148 D::result_type x_mean
= (d
.a() + d
.b()) / 2;
149 D::result_type x_var
= sqr(d
.b() - d
.a()) / 12;
150 D::result_type x_skew
= 0;
151 D::result_type x_kurtosis
= -6./5;
152 assert(std::abs((mean
- x_mean
) / x_mean
) < 0.01);
153 assert(std::abs((var
- x_var
) / x_var
) < 0.01);
154 assert(std::abs(skew
- x_skew
) < 0.01);
155 assert(std::abs((kurtosis
- x_kurtosis
) / x_kurtosis
) < 0.01);
158 typedef std::uniform_real_distribution
<> D
;
159 typedef std::mt19937_64 G
;
162 const int N
= 100000;
163 std::vector
<D::result_type
> u
;
164 for (int i
= 0; i
< N
; ++i
)
166 D::result_type v
= d(g
);
167 assert(d
.a() <= v
&& v
< d
.b());
170 D::result_type mean
= std::accumulate(u
.begin(), u
.end(),
171 D::result_type(0)) / u
.size();
172 D::result_type var
= 0;
173 D::result_type skew
= 0;
174 D::result_type kurtosis
= 0;
175 for (std::size_t i
= 0; i
< u
.size(); ++i
)
177 D::result_type dbl
= (u
[i
] - mean
);
178 D::result_type d2
= sqr(dbl
);
184 D::result_type dev
= std::sqrt(var
);
185 skew
/= u
.size() * dev
* var
;
186 kurtosis
/= u
.size() * var
* var
;
188 D::result_type x_mean
= (d
.a() + d
.b()) / 2;
189 D::result_type x_var
= sqr(d
.b() - d
.a()) / 12;
190 D::result_type x_skew
= 0;
191 D::result_type x_kurtosis
= -6./5;
192 assert(std::abs((mean
- x_mean
) / x_mean
) < 0.01);
193 assert(std::abs((var
- x_var
) / x_var
) < 0.01);
194 assert(std::abs(skew
- x_skew
) < 0.01);
195 assert(std::abs((kurtosis
- x_kurtosis
) / x_kurtosis
) < 0.01);
198 typedef std::uniform_real_distribution
<> D
;
199 typedef std::ranlux24_base G
;
202 const int N
= 100000;
203 std::vector
<D::result_type
> u
;
204 for (int i
= 0; i
< N
; ++i
)
206 D::result_type v
= d(g
);
207 assert(d
.a() <= v
&& v
< d
.b());
210 D::result_type mean
= std::accumulate(u
.begin(), u
.end(),
211 D::result_type(0)) / u
.size();
212 D::result_type var
= 0;
213 D::result_type skew
= 0;
214 D::result_type kurtosis
= 0;
215 for (std::size_t i
= 0; i
< u
.size(); ++i
)
217 D::result_type dbl
= (u
[i
] - mean
);
218 D::result_type d2
= sqr(dbl
);
224 D::result_type dev
= std::sqrt(var
);
225 skew
/= u
.size() * dev
* var
;
226 kurtosis
/= u
.size() * var
* var
;
228 D::result_type x_mean
= (d
.a() + d
.b()) / 2;
229 D::result_type x_var
= sqr(d
.b() - d
.a()) / 12;
230 D::result_type x_skew
= 0;
231 D::result_type x_kurtosis
= -6./5;
232 assert(std::abs((mean
- x_mean
) / x_mean
) < 0.01);
233 assert(std::abs((var
- x_var
) / x_var
) < 0.01);
234 assert(std::abs(skew
- x_skew
) < 0.02);
235 assert(std::abs((kurtosis
- x_kurtosis
) / x_kurtosis
) < 0.01);
238 typedef std::uniform_real_distribution
<> D
;
239 typedef std::ranlux48_base G
;
242 const int N
= 100000;
243 std::vector
<D::result_type
> u
;
244 for (int i
= 0; i
< N
; ++i
)
246 D::result_type v
= d(g
);
247 assert(d
.a() <= v
&& v
< d
.b());
250 D::result_type mean
= std::accumulate(u
.begin(), u
.end(),
251 D::result_type(0)) / u
.size();
252 D::result_type var
= 0;
253 D::result_type skew
= 0;
254 D::result_type kurtosis
= 0;
255 for (std::size_t i
= 0; i
< u
.size(); ++i
)
257 D::result_type dbl
= (u
[i
] - mean
);
258 D::result_type d2
= sqr(dbl
);
264 D::result_type dev
= std::sqrt(var
);
265 skew
/= u
.size() * dev
* var
;
266 kurtosis
/= u
.size() * var
* var
;
268 D::result_type x_mean
= (d
.a() + d
.b()) / 2;
269 D::result_type x_var
= sqr(d
.b() - d
.a()) / 12;
270 D::result_type x_skew
= 0;
271 D::result_type x_kurtosis
= -6./5;
272 assert(std::abs((mean
- x_mean
) / x_mean
) < 0.01);
273 assert(std::abs((var
- x_var
) / x_var
) < 0.01);
274 assert(std::abs(skew
- x_skew
) < 0.01);
275 assert(std::abs((kurtosis
- x_kurtosis
) / x_kurtosis
) < 0.01);
278 typedef std::uniform_real_distribution
<> D
;
279 typedef std::ranlux24 G
;
282 const int N
= 100000;
283 std::vector
<D::result_type
> u
;
284 for (int i
= 0; i
< N
; ++i
)
286 D::result_type v
= d(g
);
287 assert(d
.a() <= v
&& v
< d
.b());
290 D::result_type mean
= std::accumulate(u
.begin(), u
.end(),
291 D::result_type(0)) / u
.size();
292 D::result_type var
= 0;
293 D::result_type skew
= 0;
294 D::result_type kurtosis
= 0;
295 for (std::size_t i
= 0; i
< u
.size(); ++i
)
297 D::result_type dbl
= (u
[i
] - mean
);
298 D::result_type d2
= sqr(dbl
);
304 D::result_type dev
= std::sqrt(var
);
305 skew
/= u
.size() * dev
* var
;
306 kurtosis
/= u
.size() * var
* var
;
308 D::result_type x_mean
= (d
.a() + d
.b()) / 2;
309 D::result_type x_var
= sqr(d
.b() - d
.a()) / 12;
310 D::result_type x_skew
= 0;
311 D::result_type x_kurtosis
= -6./5;
312 assert(std::abs((mean
- x_mean
) / x_mean
) < 0.01);
313 assert(std::abs((var
- x_var
) / x_var
) < 0.01);
314 assert(std::abs(skew
- x_skew
) < 0.01);
315 assert(std::abs((kurtosis
- x_kurtosis
) / x_kurtosis
) < 0.01);
318 typedef std::uniform_real_distribution
<> D
;
319 typedef std::ranlux48 G
;
322 const int N
= 100000;
323 std::vector
<D::result_type
> u
;
324 for (int i
= 0; i
< N
; ++i
)
326 D::result_type v
= d(g
);
327 assert(d
.a() <= v
&& v
< d
.b());
330 D::result_type mean
= std::accumulate(u
.begin(), u
.end(),
331 D::result_type(0)) / u
.size();
332 D::result_type var
= 0;
333 D::result_type skew
= 0;
334 D::result_type kurtosis
= 0;
335 for (std::size_t i
= 0; i
< u
.size(); ++i
)
337 D::result_type dbl
= (u
[i
] - mean
);
338 D::result_type d2
= sqr(dbl
);
344 D::result_type dev
= std::sqrt(var
);
345 skew
/= u
.size() * dev
* var
;
346 kurtosis
/= u
.size() * var
* var
;
348 D::result_type x_mean
= (d
.a() + d
.b()) / 2;
349 D::result_type x_var
= sqr(d
.b() - d
.a()) / 12;
350 D::result_type x_skew
= 0;
351 D::result_type x_kurtosis
= -6./5;
352 assert(std::abs((mean
- x_mean
) / x_mean
) < 0.01);
353 assert(std::abs((var
- x_var
) / x_var
) < 0.01);
354 assert(std::abs(skew
- x_skew
) < 0.01);
355 assert(std::abs((kurtosis
- x_kurtosis
) / x_kurtosis
) < 0.01);
358 typedef std::uniform_real_distribution
<> D
;
359 typedef std::knuth_b G
;
362 const int N
= 100000;
363 std::vector
<D::result_type
> u
;
364 for (int i
= 0; i
< N
; ++i
)
366 D::result_type v
= d(g
);
367 assert(d
.a() <= v
&& v
< d
.b());
370 D::result_type mean
= std::accumulate(u
.begin(), u
.end(),
371 D::result_type(0)) / u
.size();
372 D::result_type var
= 0;
373 D::result_type skew
= 0;
374 D::result_type kurtosis
= 0;
375 for (std::size_t i
= 0; i
< u
.size(); ++i
)
377 D::result_type dbl
= (u
[i
] - mean
);
378 D::result_type d2
= sqr(dbl
);
384 D::result_type dev
= std::sqrt(var
);
385 skew
/= u
.size() * dev
* var
;
386 kurtosis
/= u
.size() * var
* var
;
388 D::result_type x_mean
= (d
.a() + d
.b()) / 2;
389 D::result_type x_var
= sqr(d
.b() - d
.a()) / 12;
390 D::result_type x_skew
= 0;
391 D::result_type x_kurtosis
= -6./5;
392 assert(std::abs((mean
- x_mean
) / x_mean
) < 0.01);
393 assert(std::abs((var
- x_var
) / x_var
) < 0.01);
394 assert(std::abs(skew
- x_skew
) < 0.01);
395 assert(std::abs((kurtosis
- x_kurtosis
) / x_kurtosis
) < 0.01);
398 typedef std::uniform_real_distribution
<> D
;
399 typedef std::minstd_rand G
;
402 const int N
= 100000;
403 std::vector
<D::result_type
> u
;
404 for (int i
= 0; i
< N
; ++i
)
406 D::result_type v
= d(g
);
407 assert(d
.a() <= v
&& v
< d
.b());
410 D::result_type mean
= std::accumulate(u
.begin(), u
.end(),
411 D::result_type(0)) / u
.size();
412 D::result_type var
= 0;
413 D::result_type skew
= 0;
414 D::result_type kurtosis
= 0;
415 for (std::size_t i
= 0; i
< u
.size(); ++i
)
417 D::result_type dbl
= (u
[i
] - mean
);
418 D::result_type d2
= sqr(dbl
);
424 D::result_type dev
= std::sqrt(var
);
425 skew
/= u
.size() * dev
* var
;
426 kurtosis
/= u
.size() * var
* var
;
428 D::result_type x_mean
= (d
.a() + d
.b()) / 2;
429 D::result_type x_var
= sqr(d
.b() - d
.a()) / 12;
430 D::result_type x_skew
= 0;
431 D::result_type x_kurtosis
= -6./5;
432 assert(std::abs(mean
- x_mean
) < 0.01);
433 assert(std::abs((var
- x_var
) / x_var
) < 0.01);
434 assert(std::abs(skew
- x_skew
) < 0.01);
435 assert(std::abs((kurtosis
- x_kurtosis
) / x_kurtosis
) < 0.01);
438 typedef std::uniform_real_distribution
<> D
;
439 typedef std::minstd_rand G
;
442 const int N
= 100000;
443 std::vector
<D::result_type
> u
;
444 for (int i
= 0; i
< N
; ++i
)
446 D::result_type v
= d(g
);
447 assert(d
.a() <= v
&& v
< d
.b());
450 D::result_type mean
= std::accumulate(u
.begin(), u
.end(),
451 D::result_type(0)) / u
.size();
452 D::result_type var
= 0;
453 D::result_type skew
= 0;
454 D::result_type kurtosis
= 0;
455 for (std::size_t i
= 0; i
< u
.size(); ++i
)
457 D::result_type dbl
= (u
[i
] - mean
);
458 D::result_type d2
= sqr(dbl
);
464 D::result_type dev
= std::sqrt(var
);
465 skew
/= u
.size() * dev
* var
;
466 kurtosis
/= u
.size() * var
* var
;
468 D::result_type x_mean
= (d
.a() + d
.b()) / 2;
469 D::result_type x_var
= sqr(d
.b() - d
.a()) / 12;
470 D::result_type x_skew
= 0;
471 D::result_type x_kurtosis
= -6./5;
472 assert(std::abs((mean
- x_mean
) / x_mean
) < 0.01);
473 assert(std::abs((var
- x_var
) / x_var
) < 0.01);
474 assert(std::abs(skew
- x_skew
) < 0.01);
475 assert(std::abs((kurtosis
- x_kurtosis
) / x_kurtosis
) < 0.01);