brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.2 KiB · a8cda55 Raw
109 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// <random>10 11// class bernoulli_distribution12 13// template<class _URNG> result_type operator()(_URNG& g);14 15#include <random>16#include <cassert>17#include <cmath>18#include <cstddef>19#include <numeric>20#include <vector>21 22#include "test_macros.h"23 24template <class T>25inline26T27sqr(T x)28{29    return x * x;30}31 32int main(int, char**)33{34    {35        typedef std::bernoulli_distribution D;36        typedef std::minstd_rand G;37        G g;38        D d(.75);39        const int N = 100000;40        std::vector<D::result_type> u;41        for (int i = 0; i < N; ++i)42            u.push_back(d(g));43        double mean = std::accumulate(u.begin(), u.end(),44                                              double(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.p();62        double x_var = d.p()*(1-d.p());63        double x_skew = (1 - 2 * d.p())/std::sqrt(x_var);64        double x_kurtosis = (6 * sqr(d.p()) - 6 * d.p() + 1)/x_var;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) / x_skew) < 0.02);68        assert(std::abs((kurtosis - x_kurtosis) / x_kurtosis) < 0.05);69    }70    {71        typedef std::bernoulli_distribution D;72        typedef std::minstd_rand G;73        G g;74        D d(.25);75        const int N = 100000;76        std::vector<D::result_type> u;77        for (int i = 0; i < N; ++i)78            u.push_back(d(g));79        double mean = std::accumulate(u.begin(), u.end(),80                                              double(0)) / u.size();81        double var = 0;82        double skew = 0;83        double kurtosis = 0;84        for (std::size_t i = 0; i < u.size(); ++i)85        {86            double dbl = (u[i] - mean);87            double d2 = sqr(dbl);88            var += d2;89            skew += dbl * d2;90            kurtosis += d2 * d2;91        }92        var /= u.size();93        double dev = std::sqrt(var);94        skew /= u.size() * dev * var;95        kurtosis /= u.size() * var * var;96        kurtosis -= 3;97        double x_mean = d.p();98        double x_var = d.p()*(1-d.p());99        double x_skew = (1 - 2 * d.p())/std::sqrt(x_var);100        double x_kurtosis = (6 * sqr(d.p()) - 6 * d.p() + 1)/x_var;101        assert(std::abs((mean - x_mean) / x_mean) < 0.01);102        assert(std::abs((var - x_var) / x_var) < 0.01);103        assert(std::abs((skew - x_skew) / x_skew) < 0.02);104        assert(std::abs((kurtosis - x_kurtosis) / x_kurtosis) < 0.05);105    }106 107  return 0;108}109