15 #include "absl/random/bernoulli_distribution.h"
23 #include "gtest/gtest.h"
24 #include "absl/random/internal/pcg_engine.h"
25 #include "absl/random/internal/sequence_urbg.h"
26 #include "absl/random/random.h"
33 TEST_P(BernoulliTest, Serialize) {
34 const double d = GetParam().first;
58 TEST_P(BernoulliTest, Accuracy) {
63 const std::pair<double, size_t> para = GetParam();
64 size_t trials = para.second;
65 double p = para.first;
74 for (
size_t i = 0;
i < trials; ++
i) {
81 const double stddev_p = std::sqrt((
p * (1.0 -
p)) / trials);
82 const double expected = trials *
p;
83 const double stddev = trials * stddev_p;
88 << std::abs(
static_cast<double>(yes) - expected) / stddev <<
" stddev";
97 std::make_pair(0, 30000), std::make_pair(1e-3, 30000000),
98 std::make_pair(0.1, 3000000), std::make_pair(0.5, 3000000),
99 std::make_pair(0.9, 30000000), std::make_pair(0.999, 30000000),
100 std::make_pair(1, 30000),
102 std::make_pair(std::nextafter(1.0, 0.0), 1),
103 std::make_pair(std::numeric_limits<double>::epsilon(), 1),
110 std::numeric_limits<double>::denorm_min(),
118 TEST(BernoulliTest, StabilityTest) {
122 0x0003eb76f6f7f755ull, 0xFFCEA50FDB2F953Bull, 0xC332DDEFBE6C5AA5ull,
123 0x6558218568AB9702ull, 0x2AEF7DAD5B6E2F84ull, 0x1521B62829076170ull,
124 0xECDD4775619F1510ull, 0x13CCA830EB61BD96ull, 0x0334FE1EAA0363CFull,
125 0xB5735C904C70A239ull, 0xD59E9E0BCBAADE14ull, 0xEECC86BC60622CA7ull,
126 0x4864f22c059bf29eull, 0x247856d8b862665cull, 0xe46e86e9a1337e10ull,
127 0xd8c8541f3519b133ull, 0xe75b5162c567b9e4ull, 0xf732e5ded7009c5bull,
128 0xb170b98353121eacull, 0x1ec2e8986d2362caull, 0x814c8e35fe9a961aull,
129 0x0c3cd59c9b638a02ull, 0xcb3bb6478a07715cull, 0x1224e62c978bbc7full,
130 0x671ef2cb04e81f6eull, 0x3c1cbd811eaf1808ull, 0x1bbc23cfa8fac721ull,
131 0xa4c2cda65e596a51ull, 0xb77216fad37adf91ull, 0x836d794457c08849ull,
132 0xe083df03475f49d7ull, 0xbc9feb512e6b0d6cull, 0xb12d74fdd718c8c5ull,
133 0x12ff09653bfbe4caull, 0x8dd03a105bc4ee7eull, 0x5738341045ba0d85ull,
134 0xe3fd722dc65ad09eull, 0x5a14fd21ea2a5705ull, 0x14e6ea4d6edb0c73ull,
135 0x275b0dc7e0a18acfull, 0x36cebe0d2653682eull, 0x0361e9b23861596bull,
143 for (
int i = 0;
i < 35;
i++) {
144 output.append(dist(urbg) ?
"1" :
"0");
149 const double kP = 0.0331289862362;
154 EXPECT_EQ(
v,
"00000000000010000000000010000000000") << dist;
160 EXPECT_EQ(
v,
"00000100010010010010000011000011010") << dist;
166 EXPECT_EQ(
v,
"00011110010110110011011111110111011") << dist;
172 EXPECT_EQ(
v,
"11111111111111111111011111111111111") << dist;
176 TEST(BernoulliTest, StabilityTest2) {
178 {0x0003eb76f6f7f755ull, 0xFFCEA50FDB2F953Bull, 0xC332DDEFBE6C5AA5ull,
179 0x6558218568AB9702ull, 0x2AEF7DAD5B6E2F84ull, 0x1521B62829076170ull,
180 0xECDD4775619F1510ull, 0x13CCA830EB61BD96ull, 0x0334FE1EAA0363CFull,
181 0xB5735C904C70A239ull, 0xD59E9E0BCBAADE14ull, 0xEECC86BC60622CA7ull});
188 for (
int i = 0;
i < 12;
i++) {
189 output.append(dist(urbg) ?
"1" :
"0");
194 constexpr
double b0 = 1.0 / 13.0 / 0.2;
195 constexpr
double b1 = 2.0 / 13.0 / 0.2;
196 constexpr
double b3 = (5.0 / 13.0 / 0.2) - ((1 - b0) + (1 -
b1) + (1 -
b1));