Home | History | Annotate | Download | only in rand.dist.uni.real
      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 RealType = double>
     15 // class uniform_real_distribution
     16 
     17 // template<class _URNG> result_type operator()(_URNG& g);
     18 
     19 #include <random>
     20 #include <cassert>
     21 #include <vector>
     22 #include <numeric>
     23 #include <cstddef>
     24 
     25 template <class T>
     26 inline
     27 T
     28 sqr(T x)
     29 {
     30     return x * x;
     31 }
     32 
     33 int main()
     34 {
     35     {
     36         typedef std::uniform_real_distribution<> D;
     37         typedef std::minstd_rand0 G;
     38         G g;
     39         D d;
     40         const int N = 100000;
     41         std::vector<D::result_type> u;
     42         for (int i = 0; i < N; ++i)
     43         {
     44             D::result_type v = d(g);
     45             assert(d.a() <= v && v < d.b());
     46             u.push_back(v);
     47         }
     48         D::result_type mean = std::accumulate(u.begin(), u.end(),
     49                                               D::result_type(0)) / u.size();
     50         D::result_type var = 0;
     51         D::result_type skew = 0;
     52         D::result_type kurtosis = 0;
     53         for (std::size_t i = 0; i < u.size(); ++i)
     54         {
     55             D::result_type dbl = (u[i] - mean);
     56             D::result_type d2 = sqr(dbl);
     57             var += d2;
     58             skew += dbl * d2;
     59             kurtosis += d2 * d2;
     60         }
     61         var /= u.size();
     62         D::result_type dev = std::sqrt(var);
     63         skew /= u.size() * dev * var;
     64         kurtosis /= u.size() * var * var;
     65         kurtosis -= 3;
     66         D::result_type x_mean = (d.a() + d.b()) / 2;
     67         D::result_type x_var = sqr(d.b() - d.a()) / 12;
     68         D::result_type x_skew = 0;
     69         D::result_type x_kurtosis = -6./5;
     70         assert(std::abs((mean - x_mean) / x_mean) < 0.01);
     71         assert(std::abs((var - x_var) / x_var) < 0.01);
     72         assert(std::abs(skew - x_skew) < 0.01);
     73         assert(std::abs((kurtosis - x_kurtosis) / x_kurtosis) < 0.01);
     74     }
     75     {
     76         typedef std::uniform_real_distribution<> D;
     77         typedef std::minstd_rand G;
     78         G g;
     79         D d;
     80         const int N = 100000;
     81         std::vector<D::result_type> u;
     82         for (int i = 0; i < N; ++i)
     83         {
     84             D::result_type v = d(g);
     85             assert(d.a() <= v && v < d.b());
     86             u.push_back(v);
     87         }
     88         D::result_type mean = std::accumulate(u.begin(), u.end(),
     89                                               D::result_type(0)) / u.size();
     90         D::result_type var = 0;
     91         D::result_type skew = 0;
     92         D::result_type kurtosis = 0;
     93         for (std::size_t i = 0; i < u.size(); ++i)
     94         {
     95             D::result_type dbl = (u[i] - mean);
     96             D::result_type d2 = sqr(dbl);
     97             var += d2;
     98             skew += dbl * d2;
     99             kurtosis += d2 * d2;
    100         }
    101         var /= u.size();
    102         D::result_type dev = std::sqrt(var);
    103         skew /= u.size() * dev * var;
    104         kurtosis /= u.size() * var * var;
    105         kurtosis -= 3;
    106         D::result_type x_mean = (d.a() + d.b()) / 2;
    107         D::result_type x_var = sqr(d.b() - d.a()) / 12;
    108         D::result_type x_skew = 0;
    109         D::result_type x_kurtosis = -6./5;
    110         assert(std::abs((mean - x_mean) / x_mean) < 0.01);
    111         assert(std::abs((var - x_var) / x_var) < 0.01);
    112         assert(std::abs(skew - x_skew) < 0.01);
    113         assert(std::abs((kurtosis - x_kurtosis) / x_kurtosis) < 0.01);
    114     }
    115     {
    116         typedef std::uniform_real_distribution<> D;
    117         typedef std::mt19937 G;
    118         G g;
    119         D d;
    120         const int N = 100000;
    121         std::vector<D::result_type> u;
    122         for (int i = 0; i < N; ++i)
    123         {
    124             D::result_type v = d(g);
    125             assert(d.a() <= v && v < d.b());
    126             u.push_back(v);
    127         }
    128         D::result_type mean = std::accumulate(u.begin(), u.end(),
    129                                               D::result_type(0)) / u.size();
    130         D::result_type var = 0;
    131         D::result_type skew = 0;
    132         D::result_type kurtosis = 0;
    133         for (std::size_t i = 0; i < u.size(); ++i)
    134         {
    135             D::result_type dbl = (u[i] - mean);
    136             D::result_type d2 = sqr(dbl);
    137             var += d2;
    138             skew += dbl * d2;
    139             kurtosis += d2 * d2;
    140         }
    141         var /= u.size();
    142         D::result_type dev = std::sqrt(var);
    143         skew /= u.size() * dev * var;
    144         kurtosis /= u.size() * var * var;
    145         kurtosis -= 3;
    146         D::result_type x_mean = (d.a() + d.b()) / 2;
    147         D::result_type x_var = sqr(d.b() - d.a()) / 12;
    148         D::result_type x_skew = 0;
    149         D::result_type x_kurtosis = -6./5;
    150         assert(std::abs((mean - x_mean) / x_mean) < 0.01);
    151         assert(std::abs((var - x_var) / x_var) < 0.01);
    152         assert(std::abs(skew - x_skew) < 0.01);
    153         assert(std::abs((kurtosis - x_kurtosis) / x_kurtosis) < 0.01);
    154     }
    155     {
    156         typedef std::uniform_real_distribution<> D;
    157         typedef std::mt19937_64 G;
    158         G g;
    159         D d;
    160         const int N = 100000;
    161         std::vector<D::result_type> u;
    162         for (int i = 0; i < N; ++i)
    163         {
    164             D::result_type v = d(g);
    165             assert(d.a() <= v && v < d.b());
    166             u.push_back(v);
    167         }
    168         D::result_type mean = std::accumulate(u.begin(), u.end(),
    169                                               D::result_type(0)) / u.size();
    170         D::result_type var = 0;
    171         D::result_type skew = 0;
    172         D::result_type kurtosis = 0;
    173         for (std::size_t i = 0; i < u.size(); ++i)
    174         {
    175             D::result_type dbl = (u[i] - mean);
    176             D::result_type d2 = sqr(dbl);
    177             var += d2;
    178             skew += dbl * d2;
    179             kurtosis += d2 * d2;
    180         }
    181         var /= u.size();
    182         D::result_type dev = std::sqrt(var);
    183         skew /= u.size() * dev * var;
    184         kurtosis /= u.size() * var * var;
    185         kurtosis -= 3;
    186         D::result_type x_mean = (d.a() + d.b()) / 2;
    187         D::result_type x_var = sqr(d.b() - d.a()) / 12;
    188         D::result_type x_skew = 0;
    189         D::result_type x_kurtosis = -6./5;
    190         assert(std::abs((mean - x_mean) / x_mean) < 0.01);
    191         assert(std::abs((var - x_var) / x_var) < 0.01);
    192         assert(std::abs(skew - x_skew) < 0.01);
    193         assert(std::abs((kurtosis - x_kurtosis) / x_kurtosis) < 0.01);
    194     }
    195     {
    196         typedef std::uniform_real_distribution<> D;
    197         typedef std::ranlux24_base G;
    198         G g;
    199         D d;
    200         const int N = 100000;
    201         std::vector<D::result_type> u;
    202         for (int i = 0; i < N; ++i)
    203         {
    204             D::result_type v = d(g);
    205             assert(d.a() <= v && v < d.b());
    206             u.push_back(v);
    207         }
    208         D::result_type mean = std::accumulate(u.begin(), u.end(),
    209                                               D::result_type(0)) / u.size();
    210         D::result_type var = 0;
    211         D::result_type skew = 0;
    212         D::result_type kurtosis = 0;
    213         for (std::size_t i = 0; i < u.size(); ++i)
    214         {
    215             D::result_type dbl = (u[i] - mean);
    216             D::result_type d2 = sqr(dbl);
    217             var += d2;
    218             skew += dbl * d2;
    219             kurtosis += d2 * d2;
    220         }
    221         var /= u.size();
    222         D::result_type dev = std::sqrt(var);
    223         skew /= u.size() * dev * var;
    224         kurtosis /= u.size() * var * var;
    225         kurtosis -= 3;
    226         D::result_type x_mean = (d.a() + d.b()) / 2;
    227         D::result_type x_var = sqr(d.b() - d.a()) / 12;
    228         D::result_type x_skew = 0;
    229         D::result_type x_kurtosis = -6./5;
    230         assert(std::abs((mean - x_mean) / x_mean) < 0.01);
    231         assert(std::abs((var - x_var) / x_var) < 0.01);
    232         assert(std::abs(skew - x_skew) < 0.02);
    233         assert(std::abs((kurtosis - x_kurtosis) / x_kurtosis) < 0.01);
    234     }
    235     {
    236         typedef std::uniform_real_distribution<> D;
    237         typedef std::ranlux48_base G;
    238         G g;
    239         D d;
    240         const int N = 100000;
    241         std::vector<D::result_type> u;
    242         for (int i = 0; i < N; ++i)
    243         {
    244             D::result_type v = d(g);
    245             assert(d.a() <= v && v < d.b());
    246             u.push_back(v);
    247         }
    248         D::result_type mean = std::accumulate(u.begin(), u.end(),
    249                                               D::result_type(0)) / u.size();
    250         D::result_type var = 0;
    251         D::result_type skew = 0;
    252         D::result_type kurtosis = 0;
    253         for (std::size_t i = 0; i < u.size(); ++i)
    254         {
    255             D::result_type dbl = (u[i] - mean);
    256             D::result_type d2 = sqr(dbl);
    257             var += d2;
    258             skew += dbl * d2;
    259             kurtosis += d2 * d2;
    260         }
    261         var /= u.size();
    262         D::result_type dev = std::sqrt(var);
    263         skew /= u.size() * dev * var;
    264         kurtosis /= u.size() * var * var;
    265         kurtosis -= 3;
    266         D::result_type x_mean = (d.a() + d.b()) / 2;
    267         D::result_type x_var = sqr(d.b() - d.a()) / 12;
    268         D::result_type x_skew = 0;
    269         D::result_type x_kurtosis = -6./5;
    270         assert(std::abs((mean - x_mean) / x_mean) < 0.01);
    271         assert(std::abs((var - x_var) / x_var) < 0.01);
    272         assert(std::abs(skew - x_skew) < 0.01);
    273         assert(std::abs((kurtosis - x_kurtosis) / x_kurtosis) < 0.01);
    274     }
    275     {
    276         typedef std::uniform_real_distribution<> D;
    277         typedef std::ranlux24 G;
    278         G g;
    279         D d;
    280         const int N = 100000;
    281         std::vector<D::result_type> u;
    282         for (int i = 0; i < N; ++i)
    283         {
    284             D::result_type v = d(g);
    285             assert(d.a() <= v && v < d.b());
    286             u.push_back(v);
    287         }
    288         D::result_type mean = std::accumulate(u.begin(), u.end(),
    289                                               D::result_type(0)) / u.size();
    290         D::result_type var = 0;
    291         D::result_type skew = 0;
    292         D::result_type kurtosis = 0;
    293         for (std::size_t i = 0; i < u.size(); ++i)
    294         {
    295             D::result_type dbl = (u[i] - mean);
    296             D::result_type d2 = sqr(dbl);
    297             var += d2;
    298             skew += dbl * d2;
    299             kurtosis += d2 * d2;
    300         }
    301         var /= u.size();
    302         D::result_type dev = std::sqrt(var);
    303         skew /= u.size() * dev * var;
    304         kurtosis /= u.size() * var * var;
    305         kurtosis -= 3;
    306         D::result_type x_mean = (d.a() + d.b()) / 2;
    307         D::result_type x_var = sqr(d.b() - d.a()) / 12;
    308         D::result_type x_skew = 0;
    309         D::result_type x_kurtosis = -6./5;
    310         assert(std::abs((mean - x_mean) / x_mean) < 0.01);
    311         assert(std::abs((var - x_var) / x_var) < 0.01);
    312         assert(std::abs(skew - x_skew) < 0.01);
    313         assert(std::abs((kurtosis - x_kurtosis) / x_kurtosis) < 0.01);
    314     }
    315     {
    316         typedef std::uniform_real_distribution<> D;
    317         typedef std::ranlux48 G;
    318         G g;
    319         D d;
    320         const int N = 100000;
    321         std::vector<D::result_type> u;
    322         for (int i = 0; i < N; ++i)
    323         {
    324             D::result_type v = d(g);
    325             assert(d.a() <= v && v < d.b());
    326             u.push_back(v);
    327         }
    328         D::result_type mean = std::accumulate(u.begin(), u.end(),
    329                                               D::result_type(0)) / u.size();
    330         D::result_type var = 0;
    331         D::result_type skew = 0;
    332         D::result_type kurtosis = 0;
    333         for (std::size_t i = 0; i < u.size(); ++i)
    334         {
    335             D::result_type dbl = (u[i] - mean);
    336             D::result_type d2 = sqr(dbl);
    337             var += d2;
    338             skew += dbl * d2;
    339             kurtosis += d2 * d2;
    340         }
    341         var /= u.size();
    342         D::result_type dev = std::sqrt(var);
    343         skew /= u.size() * dev * var;
    344         kurtosis /= u.size() * var * var;
    345         kurtosis -= 3;
    346         D::result_type x_mean = (d.a() + d.b()) / 2;
    347         D::result_type x_var = sqr(d.b() - d.a()) / 12;
    348         D::result_type x_skew = 0;
    349         D::result_type x_kurtosis = -6./5;
    350         assert(std::abs((mean - x_mean) / x_mean) < 0.01);
    351         assert(std::abs((var - x_var) / x_var) < 0.01);
    352         assert(std::abs(skew - x_skew) < 0.01);
    353         assert(std::abs((kurtosis - x_kurtosis) / x_kurtosis) < 0.01);
    354     }
    355     {
    356         typedef std::uniform_real_distribution<> D;
    357         typedef std::knuth_b G;
    358         G g;
    359         D d;
    360         const int N = 100000;
    361         std::vector<D::result_type> u;
    362         for (int i = 0; i < N; ++i)
    363         {
    364             D::result_type v = d(g);
    365             assert(d.a() <= v && v < d.b());
    366             u.push_back(v);
    367         }
    368         D::result_type mean = std::accumulate(u.begin(), u.end(),
    369                                               D::result_type(0)) / u.size();
    370         D::result_type var = 0;
    371         D::result_type skew = 0;
    372         D::result_type kurtosis = 0;
    373         for (std::size_t i = 0; i < u.size(); ++i)
    374         {
    375             D::result_type dbl = (u[i] - mean);
    376             D::result_type d2 = sqr(dbl);
    377             var += d2;
    378             skew += dbl * d2;
    379             kurtosis += d2 * d2;
    380         }
    381         var /= u.size();
    382         D::result_type dev = std::sqrt(var);
    383         skew /= u.size() * dev * var;
    384         kurtosis /= u.size() * var * var;
    385         kurtosis -= 3;
    386         D::result_type x_mean = (d.a() + d.b()) / 2;
    387         D::result_type x_var = sqr(d.b() - d.a()) / 12;
    388         D::result_type x_skew = 0;
    389         D::result_type x_kurtosis = -6./5;
    390         assert(std::abs((mean - x_mean) / x_mean) < 0.01);
    391         assert(std::abs((var - x_var) / x_var) < 0.01);
    392         assert(std::abs(skew - x_skew) < 0.01);
    393         assert(std::abs((kurtosis - x_kurtosis) / x_kurtosis) < 0.01);
    394     }
    395     {
    396         typedef std::uniform_real_distribution<> D;
    397         typedef std::minstd_rand G;
    398         G g;
    399         D d(-1, 1);
    400         const int N = 100000;
    401         std::vector<D::result_type> u;
    402         for (int i = 0; i < N; ++i)
    403         {
    404             D::result_type v = d(g);
    405             assert(d.a() <= v && v < d.b());
    406             u.push_back(v);
    407         }
    408         D::result_type mean = std::accumulate(u.begin(), u.end(),
    409                                               D::result_type(0)) / u.size();
    410         D::result_type var = 0;
    411         D::result_type skew = 0;
    412         D::result_type kurtosis = 0;
    413         for (std::size_t i = 0; i < u.size(); ++i)
    414         {
    415             D::result_type dbl = (u[i] - mean);
    416             D::result_type d2 = sqr(dbl);
    417             var += d2;
    418             skew += dbl * d2;
    419             kurtosis += d2 * d2;
    420         }
    421         var /= u.size();
    422         D::result_type dev = std::sqrt(var);
    423         skew /= u.size() * dev * var;
    424         kurtosis /= u.size() * var * var;
    425         kurtosis -= 3;
    426         D::result_type x_mean = (d.a() + d.b()) / 2;
    427         D::result_type x_var = sqr(d.b() - d.a()) / 12;
    428         D::result_type x_skew = 0;
    429         D::result_type x_kurtosis = -6./5;
    430         assert(std::abs(mean - x_mean) < 0.01);
    431         assert(std::abs((var - x_var) / x_var) < 0.01);
    432         assert(std::abs(skew - x_skew) < 0.01);
    433         assert(std::abs((kurtosis - x_kurtosis) / x_kurtosis) < 0.01);
    434     }
    435     {
    436         typedef std::uniform_real_distribution<> D;
    437         typedef std::minstd_rand G;
    438         G g;
    439         D d(5.5, 25);
    440         const int N = 100000;
    441         std::vector<D::result_type> u;
    442         for (int i = 0; i < N; ++i)
    443         {
    444             D::result_type v = d(g);
    445             assert(d.a() <= v && v < d.b());
    446             u.push_back(v);
    447         }
    448         D::result_type mean = std::accumulate(u.begin(), u.end(),
    449                                               D::result_type(0)) / u.size();
    450         D::result_type var = 0;
    451         D::result_type skew = 0;
    452         D::result_type kurtosis = 0;
    453         for (std::size_t i = 0; i < u.size(); ++i)
    454         {
    455             D::result_type dbl = (u[i] - mean);
    456             D::result_type d2 = sqr(dbl);
    457             var += d2;
    458             skew += dbl * d2;
    459             kurtosis += d2 * d2;
    460         }
    461         var /= u.size();
    462         D::result_type dev = std::sqrt(var);
    463         skew /= u.size() * dev * var;
    464         kurtosis /= u.size() * var * var;
    465         kurtosis -= 3;
    466         D::result_type x_mean = (d.a() + d.b()) / 2;
    467         D::result_type x_var = sqr(d.b() - d.a()) / 12;
    468         D::result_type x_skew = 0;
    469         D::result_type x_kurtosis = -6./5;
    470         assert(std::abs((mean - x_mean) / x_mean) < 0.01);
    471         assert(std::abs((var - x_var) / x_var) < 0.01);
    472         assert(std::abs(skew - x_skew) < 0.01);
    473         assert(std::abs((kurtosis - x_kurtosis) / x_kurtosis) < 0.01);
    474     }
    475 }
    476