1551d8e4ddb087da09eeb315d5d072c37412544b4Howard Hinnant//===----------------------------------------------------------------------===// 2551d8e4ddb087da09eeb315d5d072c37412544b4Howard Hinnant// 3551d8e4ddb087da09eeb315d5d072c37412544b4Howard Hinnant// The LLVM Compiler Infrastructure 4551d8e4ddb087da09eeb315d5d072c37412544b4Howard Hinnant// 5b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// This file is dual licensed under the MIT and the University of Illinois Open 6b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// Source Licenses. See LICENSE.TXT for details. 7551d8e4ddb087da09eeb315d5d072c37412544b4Howard Hinnant// 8551d8e4ddb087da09eeb315d5d072c37412544b4Howard Hinnant//===----------------------------------------------------------------------===// 9551d8e4ddb087da09eeb315d5d072c37412544b4Howard Hinnant 10551d8e4ddb087da09eeb315d5d072c37412544b4Howard Hinnant// <random> 11551d8e4ddb087da09eeb315d5d072c37412544b4Howard Hinnant 12551d8e4ddb087da09eeb315d5d072c37412544b4Howard Hinnant// template<class IntType = int> 13551d8e4ddb087da09eeb315d5d072c37412544b4Howard Hinnant// class discrete_distribution 14551d8e4ddb087da09eeb315d5d072c37412544b4Howard Hinnant 15551d8e4ddb087da09eeb315d5d072c37412544b4Howard Hinnant// template<class _URNG> result_type operator()(_URNG& g, const param_type& parm); 16551d8e4ddb087da09eeb315d5d072c37412544b4Howard Hinnant 17551d8e4ddb087da09eeb315d5d072c37412544b4Howard Hinnant#include <random> 18551d8e4ddb087da09eeb315d5d072c37412544b4Howard Hinnant#include <vector> 19551d8e4ddb087da09eeb315d5d072c37412544b4Howard Hinnant#include <cassert> 20551d8e4ddb087da09eeb315d5d072c37412544b4Howard Hinnant 21551d8e4ddb087da09eeb315d5d072c37412544b4Howard Hinnantint main() 22551d8e4ddb087da09eeb315d5d072c37412544b4Howard Hinnant{ 23551d8e4ddb087da09eeb315d5d072c37412544b4Howard Hinnant { 24551d8e4ddb087da09eeb315d5d072c37412544b4Howard Hinnant typedef std::discrete_distribution<> D; 25551d8e4ddb087da09eeb315d5d072c37412544b4Howard Hinnant typedef D::param_type P; 26551d8e4ddb087da09eeb315d5d072c37412544b4Howard Hinnant typedef std::minstd_rand G; 27551d8e4ddb087da09eeb315d5d072c37412544b4Howard Hinnant G g; 28551d8e4ddb087da09eeb315d5d072c37412544b4Howard Hinnant D d; 29551d8e4ddb087da09eeb315d5d072c37412544b4Howard Hinnant double p0[] = {.3, .1, .6}; 30551d8e4ddb087da09eeb315d5d072c37412544b4Howard Hinnant P p(p0, p0+3); 31551d8e4ddb087da09eeb315d5d072c37412544b4Howard Hinnant const int N = 10000000; 32551d8e4ddb087da09eeb315d5d072c37412544b4Howard Hinnant std::vector<D::result_type> u(3); 33551d8e4ddb087da09eeb315d5d072c37412544b4Howard Hinnant for (int i = 0; i < N; ++i) 34551d8e4ddb087da09eeb315d5d072c37412544b4Howard Hinnant { 35551d8e4ddb087da09eeb315d5d072c37412544b4Howard Hinnant D::result_type v = d(g, p); 36551d8e4ddb087da09eeb315d5d072c37412544b4Howard Hinnant assert(0 <= v && v <= 2); 37551d8e4ddb087da09eeb315d5d072c37412544b4Howard Hinnant u[v]++; 38551d8e4ddb087da09eeb315d5d072c37412544b4Howard Hinnant } 39551d8e4ddb087da09eeb315d5d072c37412544b4Howard Hinnant std::vector<double> prob = p.probabilities(); 40551d8e4ddb087da09eeb315d5d072c37412544b4Howard Hinnant for (int i = 0; i <= 2; ++i) 41551d8e4ddb087da09eeb315d5d072c37412544b4Howard Hinnant assert(std::abs((double)u[i]/N - prob[i]) / prob[i] < 0.001); 42551d8e4ddb087da09eeb315d5d072c37412544b4Howard Hinnant } 43551d8e4ddb087da09eeb315d5d072c37412544b4Howard Hinnant} 44