19 size_t count, uint64_t seed, uint64_t stream) {
21 if (
count > (1u << 24) || output_capacity <
count)
24 const uint64_t domain =
mix64(seed ^
mix64(stream));
25 for (
size_t index = 0; index <
count; ++index) {
26 const uint64_t counter = (uint64_t)index * UINT64_C(2);
27 const uint64_t first =
mix64(domain + counter);
28 const uint64_t second =
mix64(domain + counter + UINT64_C(1));
29 const double uniform_positive =
30 ((double)(first >> 11) + 0.5) * 0x1.0p-53;
31 const double uniform_angle = (double)(second >> 11) * 0x1.0p-53;
32 const double radius = sqrt(-2.0 * log(uniform_positive));
33 output[index] = (float)(radius * cos(
34 6.283185307179586476925286766559 * uniform_angle));