… | |
… | |
406 | uint32_t next (); |
406 | uint32_t next (); |
407 | |
407 | |
408 | // uniform distribution, 0 .. max (0, num - 1) |
408 | // uniform distribution, 0 .. max (0, num - 1) |
409 | uint32_t operator ()(uint32_t num) |
409 | uint32_t operator ()(uint32_t num) |
410 | { |
410 | { |
411 | return is_constant (num) |
411 | return !is_constant (num) ? get_range (num) // non-constant |
412 | ? (next () * (uint64_t)num) >> 32U |
412 | : num & (num - 1) ? (next () * (uint64_t)num) >> 32U // constant, non-power-of-two |
413 | : get_range (num); |
413 | : next () & (num - 1); // constant, power-of-two |
414 | } |
414 | } |
415 | |
415 | |
416 | // return a number within (min .. max) |
416 | // return a number within (min .. max) |
417 | int operator () (int r_min, int r_max) |
417 | int operator () (int r_min, int r_max) |
418 | { |
418 | { |