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