Home | History | Annotate | Download | only in rand.dist.norm.normal
      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 normal_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::normal_distribution<> D;
     37         typedef std::minstd_rand G;
     38         G g;
     39         D d(5, 4);
     40         const int N = 1000000;
     41         std::vector<D::result_type> u;
     42         for (int i = 0; i < N; ++i)
     43             u.push_back(d(g));
     44         double mean = std::accumulate(u.begin(), u.end(), 0.0) / u.size();
     45         double var = 0;
     46         double skew = 0;
     47         double kurtosis = 0;
     48         for (std::size_t i = 0; i < u.size(); ++i)
     49         {
     50             double dbl = (u[i] - mean);
     51             double d2 = sqr(dbl);
     52             var += d2;
     53             skew += dbl * d2;
     54             kurtosis += d2 * d2;
     55         }
     56         var /= u.size();
     57         double dev = std::sqrt(var);
     58         skew /= u.size() * dev * var;
     59         kurtosis /= u.size() * var * var;
     60         kurtosis -= 3;
     61         double x_mean = d.mean();
     62         double x_var = sqr(d.stddev());
     63         double x_skew = 0;
     64         double x_kurtosis = 0;
     65         assert(std::abs((mean - x_mean) / x_mean) < 0.01);
     66         assert(std::abs((var - x_var) / x_var) < 0.01);
     67         assert(std::abs(skew - x_skew) < 0.01);
     68         assert(std::abs(kurtosis - x_kurtosis) < 0.01);
     69     }
     70 }
     71