Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Efficient random function when I want only 0 or 1

I know you can use rand() % 2 to get a random choice of 0 and 1 in C, but is there something more efficient?

My question is not so much about C specifically but about how random number generators work. If I understand correctly, they do some complicated math on the seed to get an even distribution between 0 and RAND_MAX, but is there a way to do less math if you just need a binary choice?

Thanks

like image 745
Ethan Avatar asked Mar 17 '26 00:03

Ethan


1 Answers

is there a way to do less math if you just need a binary choice?

Yes, but it depends on how "good" a random distribution and sequence (or apparent lack) is required. C does not specify the quality of rand(). With quality of randomness specified, alternative solutions exist. How fast? - it depends on many things not supplied by OP. If code is to use rand(), the below will modestly improve performance over a simple rand() % 2u


Call rand() once in a while to extract n random bits and use 1 of those bits per call.

This function uses RAND_MAX to rate the number of bits n received per rand() call. A value of RAND_MAX == 32767 or 0x7FFF would imply 15 random bits.

int rand01(void) {
  // Insure RAND_MAX is a power-of-2 - 1
  assert(((RAND_MAX + 1u) & RAND_MAX) == 0);

  static unsigned rmax = 0;
  static int rbits;
  if (rmax == 0) {
    rmax = RAND_MAX;
    rbits = rand();
  }
  rmax /= 2u;
  int r = rbits%2u;
  rbits /= 2u;
  return r;
}

Note that this approach does not reset the random state completely with srand() . A srand() call is not aware of this function's state.

like image 132
chux - Reinstate Monica Avatar answered Mar 23 '26 23:03

chux - Reinstate Monica



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!