brintos

brintos / llvm-project-archived public Read only

0
0
Text · 16.3 KiB · 4137166 Raw
480 lines · cpp
1//===----------------------------------------------------------------------===//2//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-exception6//7//===----------------------------------------------------------------------===//8//9// REQUIRES: long_tests10 11// <random>12 13// template<class RealType = double>14// class uniform_real_distribution15 16// template<class _URNG> result_type operator()(_URNG& g);17 18#include <random>19#include <cassert>20#include <cmath>21#include <cstddef>22#include <numeric>23#include <vector>24 25#include "test_macros.h"26 27template <class T>28inline29T30sqr(T x)31{32    return x * x;33}34 35int main(int, char**)36{37    {38        typedef std::uniform_real_distribution<> D;39        typedef std::minstd_rand0 G;40        G g;41        D d;42        const int N = 100000;43        std::vector<D::result_type> u;44        for (int i = 0; i < N; ++i)45        {46            D::result_type v = d(g);47            assert(d.a() <= v && v < d.b());48            u.push_back(v);49        }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)56        {57            D::result_type dbl = (u[i] - mean);58            D::result_type d2 = sqr(dbl);59            var += d2;60            skew += dbl * d2;61            kurtosis += d2 * d2;62        }63        var /= u.size();64        D::result_type dev = std::sqrt(var);65        skew /= u.size() * dev * var;66        kurtosis /= u.size() * var * var;67        kurtosis -= 3;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);76    }77    {78        typedef std::uniform_real_distribution<> D;79        typedef std::minstd_rand G;80        G g;81        D d;82        const int N = 100000;83        std::vector<D::result_type> u;84        for (int i = 0; i < N; ++i)85        {86            D::result_type v = d(g);87            assert(d.a() <= v && v < d.b());88            u.push_back(v);89        }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)96        {97            D::result_type dbl = (u[i] - mean);98            D::result_type d2 = sqr(dbl);99            var += d2;100            skew += dbl * d2;101            kurtosis += d2 * d2;102        }103        var /= u.size();104        D::result_type dev = std::sqrt(var);105        skew /= u.size() * dev * var;106        kurtosis /= u.size() * var * var;107        kurtosis -= 3;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);116    }117    {118        typedef std::uniform_real_distribution<> D;119        typedef std::mt19937 G;120        G g;121        D d;122        const int N = 100000;123        std::vector<D::result_type> u;124        for (int i = 0; i < N; ++i)125        {126            D::result_type v = d(g);127            assert(d.a() <= v && v < d.b());128            u.push_back(v);129        }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)136        {137            D::result_type dbl = (u[i] - mean);138            D::result_type d2 = sqr(dbl);139            var += d2;140            skew += dbl * d2;141            kurtosis += d2 * d2;142        }143        var /= u.size();144        D::result_type dev = std::sqrt(var);145        skew /= u.size() * dev * var;146        kurtosis /= u.size() * var * var;147        kurtosis -= 3;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);156    }157    {158        typedef std::uniform_real_distribution<> D;159        typedef std::mt19937_64 G;160        G g;161        D d;162        const int N = 100000;163        std::vector<D::result_type> u;164        for (int i = 0; i < N; ++i)165        {166            D::result_type v = d(g);167            assert(d.a() <= v && v < d.b());168            u.push_back(v);169        }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)176        {177            D::result_type dbl = (u[i] - mean);178            D::result_type d2 = sqr(dbl);179            var += d2;180            skew += dbl * d2;181            kurtosis += d2 * d2;182        }183        var /= u.size();184        D::result_type dev = std::sqrt(var);185        skew /= u.size() * dev * var;186        kurtosis /= u.size() * var * var;187        kurtosis -= 3;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);196    }197    {198        typedef std::uniform_real_distribution<> D;199        typedef std::ranlux24_base G;200        G g;201        D d;202        const int N = 100000;203        std::vector<D::result_type> u;204        for (int i = 0; i < N; ++i)205        {206            D::result_type v = d(g);207            assert(d.a() <= v && v < d.b());208            u.push_back(v);209        }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)216        {217            D::result_type dbl = (u[i] - mean);218            D::result_type d2 = sqr(dbl);219            var += d2;220            skew += dbl * d2;221            kurtosis += d2 * d2;222        }223        var /= u.size();224        D::result_type dev = std::sqrt(var);225        skew /= u.size() * dev * var;226        kurtosis /= u.size() * var * var;227        kurtosis -= 3;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);236    }237    {238        typedef std::uniform_real_distribution<> D;239        typedef std::ranlux48_base G;240        G g;241        D d;242        const int N = 100000;243        std::vector<D::result_type> u;244        for (int i = 0; i < N; ++i)245        {246            D::result_type v = d(g);247            assert(d.a() <= v && v < d.b());248            u.push_back(v);249        }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)256        {257            D::result_type dbl = (u[i] - mean);258            D::result_type d2 = sqr(dbl);259            var += d2;260            skew += dbl * d2;261            kurtosis += d2 * d2;262        }263        var /= u.size();264        D::result_type dev = std::sqrt(var);265        skew /= u.size() * dev * var;266        kurtosis /= u.size() * var * var;267        kurtosis -= 3;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);276    }277    {278        typedef std::uniform_real_distribution<> D;279        typedef std::ranlux24 G;280        G g;281        D d;282        const int N = 100000;283        std::vector<D::result_type> u;284        for (int i = 0; i < N; ++i)285        {286            D::result_type v = d(g);287            assert(d.a() <= v && v < d.b());288            u.push_back(v);289        }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)296        {297            D::result_type dbl = (u[i] - mean);298            D::result_type d2 = sqr(dbl);299            var += d2;300            skew += dbl * d2;301            kurtosis += d2 * d2;302        }303        var /= u.size();304        D::result_type dev = std::sqrt(var);305        skew /= u.size() * dev * var;306        kurtosis /= u.size() * var * var;307        kurtosis -= 3;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);316    }317    {318        typedef std::uniform_real_distribution<> D;319        typedef std::ranlux48 G;320        G g;321        D d;322        const int N = 100000;323        std::vector<D::result_type> u;324        for (int i = 0; i < N; ++i)325        {326            D::result_type v = d(g);327            assert(d.a() <= v && v < d.b());328            u.push_back(v);329        }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)336        {337            D::result_type dbl = (u[i] - mean);338            D::result_type d2 = sqr(dbl);339            var += d2;340            skew += dbl * d2;341            kurtosis += d2 * d2;342        }343        var /= u.size();344        D::result_type dev = std::sqrt(var);345        skew /= u.size() * dev * var;346        kurtosis /= u.size() * var * var;347        kurtosis -= 3;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);356    }357    {358        typedef std::uniform_real_distribution<> D;359        typedef std::knuth_b G;360        G g;361        D d;362        const int N = 100000;363        std::vector<D::result_type> u;364        for (int i = 0; i < N; ++i)365        {366            D::result_type v = d(g);367            assert(d.a() <= v && v < d.b());368            u.push_back(v);369        }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)376        {377            D::result_type dbl = (u[i] - mean);378            D::result_type d2 = sqr(dbl);379            var += d2;380            skew += dbl * d2;381            kurtosis += d2 * d2;382        }383        var /= u.size();384        D::result_type dev = std::sqrt(var);385        skew /= u.size() * dev * var;386        kurtosis /= u.size() * var * var;387        kurtosis -= 3;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);396    }397    {398        typedef std::uniform_real_distribution<> D;399        typedef std::minstd_rand G;400        G g;401        D d(-1, 1);402        const int N = 100000;403        std::vector<D::result_type> u;404        for (int i = 0; i < N; ++i)405        {406            D::result_type v = d(g);407            assert(d.a() <= v && v < d.b());408            u.push_back(v);409        }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)416        {417            D::result_type dbl = (u[i] - mean);418            D::result_type d2 = sqr(dbl);419            var += d2;420            skew += dbl * d2;421            kurtosis += d2 * d2;422        }423        var /= u.size();424        D::result_type dev = std::sqrt(var);425        skew /= u.size() * dev * var;426        kurtosis /= u.size() * var * var;427        kurtosis -= 3;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);436    }437    {438        typedef std::uniform_real_distribution<> D;439        typedef std::minstd_rand G;440        G g;441        D d(5.5, 25);442        const int N = 100000;443        std::vector<D::result_type> u;444        for (int i = 0; i < N; ++i)445        {446            D::result_type v = d(g);447            assert(d.a() <= v && v < d.b());448            u.push_back(v);449        }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)456        {457            D::result_type dbl = (u[i] - mean);458            D::result_type d2 = sqr(dbl);459            var += d2;460            skew += dbl * d2;461            kurtosis += d2 * d2;462        }463        var /= u.size();464        D::result_type dev = std::sqrt(var);465        skew /= u.size() * dev * var;466        kurtosis /= u.size() * var * var;467        kurtosis -= 3;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);476    }477 478  return 0;479}480