From 88177a3248d15a44f442f7e52ecfd61645391d7b Mon Sep 17 00:00:00 2001 From: tylo Date: Fri, 7 Aug 2020 17:47:38 +0200 Subject: Added i64 uniform distribution range. in crandom.h --- examples/rngtest.c | 8 ++++++-- stc/crandom.h | 16 ++++++++++++++++ 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/examples/rngtest.c b/examples/rngtest.c index ca037292..66e5f0c8 100644 --- a/examples/rngtest.c +++ b/examples/rngtest.c @@ -12,7 +12,12 @@ int main(void) { clock_t difference, before; uint64_t v; - printf("start\n"); + + crandom_eng64_t sfc = crandom_eng64_init(time(NULL)); + crandom_distrib_i64_t d10 = crandom_uniform_i64_init(10, 20); + + for (int i=0; i<30; ++i) printf("%02zd ", crandom_uniform_i64(&sfc, d10)); + puts(""); crandom_eng32_t pcg = crandom_eng32_init(time(NULL)); before = clock(); \ @@ -23,7 +28,6 @@ int main(void) difference = clock() - before; printf("pcg32: %.02f, %zu\n", (float) difference / CLOCKS_PER_SEC, v); - crandom_eng64_t sfc = crandom_eng64_init(time(NULL)); before = clock(); \ v = 0; for (size_t i=0; i> 64); +#elif defined(_MSC_VER) + int64_t hi; _mul128(crandom_i64(rng) >> 1, dist.range << 1, &hi); return dist.offset + hi; +#else + return dist.offset + (((uint32_t) crandom_i64(rng) * dist.range) >> 32); // range up to 2^32 + //return dist.offset + crandom_i64(rng) % dist.range; // slow +#endif +} + STC_INLINE crandom_distrib_f64_t crandom_uniform_f64_init(double low, double high) { crandom_distrib_f64_t dist = {low, high - low}; return dist; } -- cgit v1.2.3