int main() { uint64_t u, v, w; uint64_t seed = time(0); RAND_NR_INIT(u, v, w, seed); for (int i = 0; i < 100; i++) printf("rand number = %llx\n", (unsigned long long)RAND_NR_NEXT(u, v, w)); uint64_t r = RAND_NR_NEXT(u, v, w); uint64_t s = BIN_TO_GRAYCODE(r); uint64_t t = BIN_TO_GRAYCODE(r + 1); assert(hweight64(t ^ s) == 1); GRAYCODE_TO_BIN64(s); assert(rev8(5) == 160); assert(rev8_hakmem(5) == 160); uint64_t hi, lo; MULQ(0x1234567887654321ul, 0x77665544332211fful, lo, hi); assert(hi == 611815671993850618UL); assert(lo == 14353276178066116319UL); if (s != r) fprintf(stderr, "expected %016llx, acutal %016llx\n", (unsigned long long)r, (unsigned long long)s); else printf("passed\n"); return 0; }
int main() { uint64_t u, v, w; uint64_t seed = time(0); RAND_NR_INIT(u, v, w, seed); for (int i = 0; i < 100; i++) printf("rand number = %llx\n", (unsigned long long)RAND_NR_NEXT(u, v, w)); uint64_t h = 0; printf("rand int mix1 = %llx\n", (unsigned long long)RAND_INT_MIX64(h)); printf("rand int mix2 = %llx\n", (unsigned long long)RAND_INT2_MIX64(h)); printf("rand int mix3 = %llx\n", (unsigned long long)RAND_INT3_MIX64(h)); printf("rand int mix4 = %llx\n", (unsigned long long)RAND_INT4_MIX64(h)); uint64_t r = RAND_NR_NEXT(u, v, w); uint64_t s = r; RAND_INT4_MIX64(s); RAND_INT4_MIX64_INV(s); if (s != r) fprintf(stderr, "expected %016llx, acutal %016llx\n", (unsigned long long)r, (unsigned long long)s); else printf("passed\n"); return 0; }
void hweight64_test() { for (int i = 0; i < 100000; ++i) { uint64_t r = RAND_NR_NEXT(u, v, w); assert(__builtin_popcountll(r) == hweight64(r)); } }
void hweight32_hakmem_test() { for (int i = 0; i < 100000; ++i) { uint32_t r = RAND_NR_NEXT(u, v, w); assert(__builtin_popcountl(r) == hweight32_hakmem(r)); } }
int zipf_rng_next(struct zipf_rng *rng) { double m = RAND_NR_DOUBLE(RAND_NR_NEXT(rng->u, rng->v, rng->w)); if (isequalf(rng->s, 1.0)) return (int)exp(m * rng->sum); return (int)pow(m * rng->sum * (1.0 - rng->s) + 1.0, 1.0/(1.0 - rng->s)); }
void hweight15_test() { for (int i = 0; i < 100000; ++i) { uint16_t r = RAND_NR_NEXT(u, v, w) & 0x7fff; if (r == 0x7fffu) --r; assert(__builtin_popcount(r) == hweight15(r)); } }
static inline void __init_seeds(uint64_t *seeds, int nseed) { uint64_t x, y, z; uint64_t seed = lrand48(); int i; RAND_NR_INIT(x, y, z, seed); for (i = 0; i < nseed; i++) seeds[i] = RAND_NR_NEXT(x, y, z); }
int main() { uint64_t u, v, w; RAND_NR_INIT(u, v, w, 0UL); for (int i = 0; i < 100; i++) printf("rand number = %llx\n", (unsigned long long)RAND_NR_NEXT(u, v, w)); uint64_t h = 0; printf("rand int mix1 = %llx\n", (unsigned long long)RAND_INT_MIX64(h)); printf("rand int mix2 = %llx\n", (unsigned long long)RAND_INT2_MIX64(h)); printf("passed\n"); return 0; }