Expand Up
@@ -21,72 +21,73 @@
#include " test_macros.h"
int main (int , char **)
{
template <class T >
void tests () {
typedef long long Frequency;
{
typedef std::discrete_distribution<> D;
typedef std::discrete_distribution<T > D;
typedef std::minstd_rand G;
G g;
D d;
const int N = 100 ;
std::vector<D::result_type > u (d.max ()+1 );
std::vector<Frequency > u (d.max ()+1 );
for (int i = 0 ; i < N; ++i)
{
D::result_type v = d (g);
typename D::result_type v = d (g);
assert (d.min () <= v && v <= d.max ());
u[v]++;
}
std::vector<double > prob = d.probabilities ();
for (int i = 0 ; i <= d. max (); ++i)
for (unsigned i = 0 ; i < u. size (); ++i)
assert ((double )u[i]/N == prob[i]);
}
{
typedef std::discrete_distribution<> D;
typedef std::discrete_distribution<T > D;
typedef std::minstd_rand G;
G g;
double p0[] = {.3 };
D d (p0, p0+1 );
const int N = 100 ;
std::vector<D::result_type > u (d.max ()+1 );
std::vector<Frequency > u (d.max ()+1 );
for (int i = 0 ; i < N; ++i)
{
D::result_type v = d (g);
typename D::result_type v = d (g);
assert (d.min () <= v && v <= d.max ());
u[v]++;
}
std::vector<double > prob = d.probabilities ();
for (int i = 0 ; i <= d. max (); ++i)
for (unsigned i = 0 ; i < u. size (); ++i)
assert ((double )u[i]/N == prob[i]);
}
{
typedef std::discrete_distribution<> D;
typedef std::discrete_distribution<T > D;
typedef std::minstd_rand G;
G g;
double p0[] = {.75 , .25 };
D d (p0, p0+2 );
const int N = 1000000 ;
std::vector<D::result_type > u (d.max ()+1 );
std::vector<Frequency > u (d.max ()+1 );
for (int i = 0 ; i < N; ++i)
{
D::result_type v = d (g);
typename D::result_type v = d (g);
assert (d.min () <= v && v <= d.max ());
u[v]++;
}
std::vector<double > prob = d.probabilities ();
for (int i = 0 ; i <= d. max (); ++i)
for (unsigned i = 0 ; i < u. size (); ++i)
assert (std::abs ((double )u[i]/N - prob[i]) / prob[i] < 0.001 );
}
{
typedef std::discrete_distribution<> D;
typedef std::discrete_distribution<T > D;
typedef std::minstd_rand G;
G g;
double p0[] = {0 , 1 };
D d (p0, p0+2 );
const int N = 1000000 ;
std::vector<D::result_type > u (d.max ()+1 );
std::vector<Frequency > u (d.max ()+1 );
for (int i = 0 ; i < N; ++i)
{
D::result_type v = d (g);
typename D::result_type v = d (g);
assert (d.min () <= v && v <= d.max ());
u[v]++;
}
Expand All
@@ -95,16 +96,16 @@ int main(int, char**)
assert ((double )u[1 ]/N == prob[1 ]);
}
{
typedef std::discrete_distribution<> D;
typedef std::discrete_distribution<T > D;
typedef std::minstd_rand G;
G g;
double p0[] = {1 , 0 };
D d (p0, p0+2 );
const int N = 1000000 ;
std::vector<D::result_type > u (d.max ()+1 );
std::vector<Frequency > u (d.max ()+1 );
for (int i = 0 ; i < N; ++i)
{
D::result_type v = d (g);
typename D::result_type v = d (g);
assert (d.min () <= v && v <= d.max ());
u[v]++;
}
Expand All
@@ -113,170 +114,191 @@ int main(int, char**)
assert ((double )u[1 ]/N == prob[1 ]);
}
{
typedef std::discrete_distribution<> D;
typedef std::discrete_distribution<T > D;
typedef std::minstd_rand G;
G g;
double p0[] = {.3 , .1 , .6 };
D d (p0, p0+3 );
const int N = 10000000 ;
std::vector<D::result_type > u (d.max ()+1 );
std::vector<Frequency > u (d.max ()+1 );
for (int i = 0 ; i < N; ++i)
{
D::result_type v = d (g);
typename D::result_type v = d (g);
assert (d.min () <= v && v <= d.max ());
u[v]++;
}
std::vector<double > prob = d.probabilities ();
for (int i = 0 ; i <= d. max (); ++i)
for (unsigned i = 0 ; i < u. size (); ++i)
assert (std::abs ((double )u[i]/N - prob[i]) / prob[i] < 0.001 );
}
{
typedef std::discrete_distribution<> D;
typedef std::discrete_distribution<T > D;
typedef std::minstd_rand G;
G g;
double p0[] = {0 , 25 , 75 };
D d (p0, p0+3 );
const int N = 1000000 ;
std::vector<D::result_type > u (d.max ()+1 );
std::vector<Frequency > u (d.max ()+1 );
for (int i = 0 ; i < N; ++i)
{
D::result_type v = d (g);
typename D::result_type v = d (g);
assert (d.min () <= v && v <= d.max ());
u[v]++;
}
std::vector<double > prob = d.probabilities ();
for (int i = 0 ; i <= d. max (); ++i)
for (unsigned i = 0 ; i < u. size (); ++i)
if (prob[i] != 0 )
assert (std::abs ((double )u[i]/N - prob[i]) / prob[i] < 0.001 );
else
assert (u[i] == 0 );
}
{
typedef std::discrete_distribution<> D;
typedef std::discrete_distribution<T > D;
typedef std::minstd_rand G;
G g;
double p0[] = {25 , 0 , 75 };
D d (p0, p0+3 );
const int N = 1000000 ;
std::vector<D::result_type > u (d.max ()+1 );
std::vector<Frequency > u (d.max ()+1 );
for (int i = 0 ; i < N; ++i)
{
D::result_type v = d (g);
typename D::result_type v = d (g);
assert (d.min () <= v && v <= d.max ());
u[v]++;
}
std::vector<double > prob = d.probabilities ();
for (int i = 0 ; i <= d. max (); ++i)
for (unsigned i = 0 ; i < u. size (); ++i)
if (prob[i] != 0 )
assert (std::abs ((double )u[i]/N - prob[i]) / prob[i] < 0.001 );
else
assert (u[i] == 0 );
}
{
typedef std::discrete_distribution<> D;
typedef std::discrete_distribution<T > D;
typedef std::minstd_rand G;
G g;
double p0[] = {25 , 75 , 0 };
D d (p0, p0+3 );
const int N = 1000000 ;
std::vector<D::result_type > u (d.max ()+1 );
std::vector<Frequency > u (d.max ()+1 );
for (int i = 0 ; i < N; ++i)
{
D::result_type v = d (g);
typename D::result_type v = d (g);
assert (d.min () <= v && v <= d.max ());
u[v]++;
}
std::vector<double > prob = d.probabilities ();
for (int i = 0 ; i <= d. max (); ++i)
for (unsigned i = 0 ; i < u. size (); ++i)
if (prob[i] != 0 )
assert (std::abs ((double )u[i]/N - prob[i]) / prob[i] < 0.001 );
else
assert (u[i] == 0 );
}
{
typedef std::discrete_distribution<> D;
typedef std::discrete_distribution<T > D;
typedef std::minstd_rand G;
G g;
double p0[] = {0 , 0 , 1 };
D d (p0, p0+3 );
const int N = 100 ;
std::vector<D::result_type > u (d.max ()+1 );
std::vector<Frequency > u (d.max ()+1 );
for (int i = 0 ; i < N; ++i)
{
D::result_type v = d (g);
typename D::result_type v = d (g);
assert (d.min () <= v && v <= d.max ());
u[v]++;
}
std::vector<double > prob = d.probabilities ();
for (int i = 0 ; i <= d. max (); ++i)
for (unsigned i = 0 ; i < u. size (); ++i)
if (prob[i] != 0 )
assert (std::abs ((double )u[i]/N - prob[i]) / prob[i] < 0.001 );
else
assert (u[i] == 0 );
}
{
typedef std::discrete_distribution<> D;
typedef std::discrete_distribution<T > D;
typedef std::minstd_rand G;
G g;
double p0[] = {0 , 1 , 0 };
D d (p0, p0+3 );
const int N = 100 ;
std::vector<D::result_type > u (d.max ()+1 );
std::vector<Frequency > u (d.max ()+1 );
for (int i = 0 ; i < N; ++i)
{
D::result_type v = d (g);
typename D::result_type v = d (g);
assert (d.min () <= v && v <= d.max ());
u[v]++;
}
std::vector<double > prob = d.probabilities ();
for (int i = 0 ; i <= d. max (); ++i)
for (unsigned i = 0 ; i < u. size (); ++i)
if (prob[i] != 0 )
assert (std::abs ((double )u[i]/N - prob[i]) / prob[i] < 0.001 );
else
assert (u[i] == 0 );
}
{
typedef std::discrete_distribution<> D;
typedef std::discrete_distribution<T > D;
typedef std::minstd_rand G;
G g;
double p0[] = {1 , 0 , 0 };
D d (p0, p0+3 );
const int N = 100 ;
std::vector<D::result_type > u (d.max ()+1 );
std::vector<Frequency > u (d.max ()+1 );
for (int i = 0 ; i < N; ++i)
{
D::result_type v = d (g);
typename D::result_type v = d (g);
assert (d.min () <= v && v <= d.max ());
u[v]++;
}
std::vector<double > prob = d.probabilities ();
for (int i = 0 ; i <= d. max (); ++i)
for (unsigned i = 0 ; i < u. size (); ++i)
if (prob[i] != 0 )
assert (std::abs ((double )u[i]/N - prob[i]) / prob[i] < 0.001 );
else
assert (u[i] == 0 );
}
{
typedef std::discrete_distribution<> D;
typedef std::discrete_distribution<T > D;
typedef std::minstd_rand G;
G g;
double p0[] = {33 , 0 , 0 , 67 };
D d (p0, p0+3 );
const int N = 1000000 ;
std::vector<D::result_type > u (d.max ()+1 );
std::vector<Frequency > u (d.max ()+1 );
for (int i = 0 ; i < N; ++i)
{
D::result_type v = d (g);
typename D::result_type v = d (g);
assert (d.min () <= v && v <= d.max ());
u[v]++;
}
std::vector<double > prob = d.probabilities ();
for (int i = 0 ; i <= d. max (); ++i)
for (unsigned i = 0 ; i < u. size (); ++i)
if (prob[i] != 0 )
assert (std::abs ((double )u[i]/N - prob[i]) / prob[i] < 0.001 );
else
assert (u[i] == 0 );
}
}
int main (int , char **) {
tests<short >();
tests<int >();
tests<long >();
tests<long long >();
tests<unsigned short >();
tests<unsigned int >();
tests<unsigned long >();
tests<unsigned long long >();
#if defined(_LIBCPP_VERSION) // extension
tests<int8_t >();
tests<uint8_t >();
#if !defined(TEST_HAS_NO_INT128)
tests<__int128_t >();
tests<__uint128_t >();
#endif
#endif
return 0 ;
return 0 ;
}