Lines Matching +full:rng +full:-
9 * https://github.com/imneme/pcg-c
11 * -----------------------------------------------------------------------------
15 * Copyright (c) 2014-2017 Melissa O'Neill and PCG Project contributors
16 * Copyright (c) 2018-2025 Gavin D. Howard and contributors.
38 * Code for the RNG.
64 * Adds two 64-bit values and preserves the overflow.
81 * Adds two 128-bit values and discards the overflow.
99 * Multiplies two 64-bit values and preserves the overflow.
129 * Multiplies two 128-bit values and discards the overflow.
161 r->inc |= (BcRandState) 1UL; in bc_rand_setModified()
163 r->inc.lo |= (uint_fast64_t) 1UL; in bc_rand_setModified()
176 r->inc &= ~((BcRandState) 1UL); in bc_rand_clearModified()
178 r->inc.lo &= ~(1UL); in bc_rand_clearModified()
251 * Reads random data from rand(), byte-by-byte because rand() is only guaranteed
253 * preferred as it is possible to access cryptographically-secure PRNG's on most
266 // Fill up the unsigned long byte-by-byte. in bc_rand_rand()
287 inc = r->inc | 1; in bc_rand_inc()
289 inc.lo = r->inc.lo | 1; in bc_rand_inc()
290 inc.hi = r->inc.hi; in bc_rand_inc()
304 r->inc <<= 1UL; in bc_rand_setupInc()
306 r->inc.hi <<= 1UL; in bc_rand_setupInc()
307 r->inc.hi |= (r->inc.lo & (1UL << (BC_LONG_BIT - 1))) >> (BC_LONG_BIT - 1); in bc_rand_setupInc()
308 r->inc.lo <<= 1UL; in bc_rand_setupInc()
324 state->lo = val1; in bc_rand_seedState()
325 state->hi = val2; in bc_rand_seedState()
341 bc_rand_seedState(&r->state, state1, state2); in bc_rand_seedRNG()
342 bc_rand_seedState(&r->inc, inc1, inc2); in bc_rand_seedRNG()
373 BcRandState temp = bc_rand_mul2(r->state, bc_rand_multiplier); in bc_rand_step()
374 r->state = bc_rand_add2(temp, bc_rand_inc(r)); in bc_rand_step()
385 return BC_RAND_ROT(BC_RAND_FOLD(r->state), BC_RAND_ROTAMT(r->state)); in bc_rand_output()
392 * @param rng The PRNG on the top of the stack. Must have been seeded.
395 bc_rand_seedZeroes(BcRNG* r, BcRNGData* rng, size_t idx) in bc_rand_seedZeroes() argument
400 if (r->v.len <= idx) return; in bc_rand_seedZeroes()
403 rng2 = bc_vec_item_rev(&r->v, idx); in bc_rand_seedZeroes()
411 for (i = 1; i < r->v.len; ++i) in bc_rand_seedZeroes()
413 bc_rand_copy(bc_vec_item_rev(&r->v, i), rng); in bc_rand_seedZeroes()
419 bc_rand_srand(BcRNGData* rng) in bc_rand_srand() argument
432 bc_rand_fill(rng, bc_rand_frand, &fd); in bc_rand_srand()
442 bc_rand_fill(rng, bc_rand_frand, &fd); in bc_rand_srand()
448 bc_rand_fill(rng, bc_rand_winrand, NULL); in bc_rand_srand()
452 while (BC_ERR(BC_RAND_ZERO(rng))) in bc_rand_srand()
454 bc_rand_fill(rng, bc_rand_rand, NULL); in bc_rand_srand()
464 * @param rng The PRNG that will be used to seed the others.
467 bc_rand_propagate(BcRNG* r, BcRNGData* rng) in bc_rand_propagate() argument
470 if (r->v.len <= 1) return; in bc_rand_propagate()
473 if (BC_RAND_NOTMODIFIED(rng)) in bc_rand_propagate()
479 for (i = 1; go && i < r->v.len; ++i) in bc_rand_propagate()
481 BcRNGData* rng2 = bc_vec_item_rev(&r->v, i); in bc_rand_propagate()
485 bc_rand_copy(rng2, rng); in bc_rand_propagate()
489 bc_rand_seedZeroes(r, rng, i); in bc_rand_propagate()
492 else bc_rand_seedZeroes(r, rng, 1); in bc_rand_propagate()
499 BcRNGData* rng = bc_vec_top(&r->v); in bc_rand_int() local
503 if (BC_ERR(BC_RAND_ZERO(rng))) bc_rand_srand(rng); in bc_rand_int()
508 bc_rand_step(rng); in bc_rand_int()
509 bc_rand_propagate(r, rng); in bc_rand_int()
510 res = bc_rand_output(rng); in bc_rand_int()
524 threshold = (0 - bound) % bound; in bc_rand_bounded()
539 BcRNGData* rng = bc_vec_top(&r->v); in bc_rand_seed() local
542 bc_rand_seedState(&rng->inc, inc1, inc2); in bc_rand_seed()
543 bc_rand_setupInc(rng); in bc_rand_seed()
544 bc_rand_setModified(rng); in bc_rand_seed()
551 memcpy(&rng->state, &rng->inc, sizeof(BcRandState)); in bc_rand_seed()
552 bc_rand_step(rng); in bc_rand_seed()
554 else bc_rand_seedState(&rng->state, state1, state2); in bc_rand_seed()
557 bc_rand_propagate(r, rng); in bc_rand_seed()
573 res = r->inc >> 1; in bc_rand_getInc()
575 res = r->inc; in bc_rand_getInc()
577 res.lo |= (res.hi & 1) << (BC_LONG_BIT - 1); in bc_rand_getInc()
588 BcRNGData* rng = bc_vec_top(&r->v); in bc_rand_getRands() local
590 if (BC_ERR(BC_RAND_ZERO(rng))) bc_rand_srand(rng); in bc_rand_getRands()
593 inc = bc_rand_getInc(rng); in bc_rand_getRands()
596 *s1 = BC_RAND_TRUNC(rng->state); in bc_rand_getRands()
597 *s2 = BC_RAND_CHOP(rng->state); in bc_rand_getRands()
607 BcRNGData* rng = bc_vec_pushEmpty(&r->v); in bc_rand_push() local
612 memset(rng, 0, sizeof(BcRNGData)); in bc_rand_push()
615 if (r->v.len > 1) bc_rand_copy(rng, bc_vec_item_rev(&r->v, 1)); in bc_rand_push()
621 bc_vec_npop(&r->v, reset ? r->v.len - 1 : 1); in bc_rand_pop()
628 bc_vec_init(&r->v, sizeof(BcRNGData), BC_DTOR_NONE); in bc_rand_init()
637 bc_vec_free(&r->v); in bc_rand_free()