76 int key1,
int key2 = 0) {
78 using rng_type = r123::Philox4x64;
79 using ctr_type = rng_type::ctr_type;
80 using key_type = rng_type::key_type;
82 const ctr_type c{{counter, 0u, 0u, 0u}};
84 auto const id1 =
static_cast<uint32_t
>(key1);
85 auto const id2 =
static_cast<uint32_t
>(key2);
89 return rng_type{}(c, k);
147 auto const integers = philox_4_uint64s<salt>(counter, seed, key1, key2);
149 constexpr std::size_t M = (N <= 2) ? 2 : 4;
150 constexpr auto epsilon = std::numeric_limits<double>::min();
152 for (std::size_t i = 0; i < M; ++i) {
154 u[i] = (res < epsilon) ? epsilon : res;
163 auto const modulo = std::sqrt(-2. * std::log(u[0]));
164 auto const angle = 2. * std::numbers::pi * u[1];
165 noise[0] = modulo * std::cos(angle);
167 noise[1] = modulo * std::sin(angle);
171 auto const modulo = std::sqrt(-2. * log(u[2]));
172 auto const angle = 2. * std::numbers::pi * u[3];
173 noise[2] = modulo * std::cos(angle);
175 noise[3] = modulo * std::sin(angle);