On Sat, Jan 07, 2023 at 01:42:20PM -0500, Greg Wooledge wrote:
> Or should the code do the multiplications with unsigned
> values, store them in unsigned variables, and then replace the subtraction
> with some kind of conditional that checks which of the two is greater?

Here's a version that does just that:

static u_bits32_t
intrand32 (last)
     u_bits32_t last;
{
  u_bits32_t h, l, t1, t2, ret;

  ret = (last == 0) ? 123459876 : last;
  h = ret / 127773;
  l = ret - (127773 * h);
  t1 = 16807 * l;
  t2 = 2836 * h;
  if (t1 < t2)
    ret = 0x7fffffff - t2 + t1;
  else
    ret = t1 - t2;

  return ret;
}

It passes the implementation test in the paper (checking the seed
after 10000 iterations), and I believe it's free from any kind of
overflow.

Do with it as you like.  Feel free to replace the if/else with a
ternary ?: operator if that's your preference.

Reply via email to