15 #include "absl/random/internal/pool_urbg.h"
23 #include "gtest/gtest.h"
24 #include "absl/meta/type_traits.h"
25 #include "absl/types/span.h"
35 std::is_same<T, RandenPool<uint8_t>>,
36 std::is_same<T, RandenPool<uint16_t>>,
37 std::is_same<T, RandenPool<uint32_t>>,
38 std::is_same<T, RandenPool<uint64_t>>>;
41 template <
typename T,
typename V>
47 template <
typename T,
typename V>
53 template <
typename EngineType>
79 "engine must be copy constructible");
82 "engine must be copy assignable");
89 static_assert(std::is_same<decltype(
e()),
T>::
value,
90 "return type of operator() must be result_type");
100 TYPED_TEST(PoolURBGTypedTest, VerifySequences) {
107 constexpr
int kNumOutputs = 64;
126 size_t changed_bits = 0;
127 size_t unchanged_bits = 0;
128 size_t total_set = 0;
129 size_t total_bits = 0;
130 size_t equal_count = 0;
131 for (
size_t i = 0;
i < kNumOutputs; ++
i) {
132 equal_count += (
a[
i] ==
b[
i]) ? 1 : 0;
134 changed_bits += bitset.count();
135 unchanged_bits += bitset.size() - bitset.count();
139 total_set += a_set.count() + b_set.count();
143 EXPECT_LE(changed_bits, 0.60 * (changed_bits + unchanged_bits));
144 EXPECT_GE(changed_bits, 0.40 * (changed_bits + unchanged_bits));
147 EXPECT_NEAR(total_set, total_bits * 0.5, 4 * std::sqrt(total_bits))
148 <<
"@" << total_set /
static_cast<double>(total_bits);
152 const double kExpected = kNumOutputs / (1.0 *
sizeof(
result_type) * 8);