summaryrefslogtreecommitdiff
path: root/gl/lib/randint.c
diff options
context:
space:
mode:
Diffstat (limited to 'gl/lib/randint.c')
-rw-r--r--gl/lib/randint.c132
1 files changed, 66 insertions, 66 deletions
diff --git a/gl/lib/randint.c b/gl/lib/randint.c
index 0edda0aa0..cfa6e232b 100644
--- a/gl/lib/randint.c
+++ b/gl/lib/randint.c
@@ -128,75 +128,75 @@ randint_genmax (struct randint_source *s, randint genmax)
for (;;)
{
if (randmax < genmax)
- {
- /* Calculate how many input bytes will be needed, and read
- the bytes. */
-
- size_t i = 0;
- randint rmax = randmax;
- unsigned char buf[sizeof randnum];
-
- do
- {
- rmax = shift_left (rmax) + UCHAR_MAX;
- i++;
- }
- while (rmax < genmax);
-
- randread (source, buf, i);
-
- /* Increase RANDMAX by appending random bytes to RANDNUM and
- UCHAR_MAX to RANDMAX until RANDMAX is no less than
- GENMAX. This may lose up to CHAR_BIT bits of information
- if shift_right (RANDINT_MAX) < GENMAX, but it is not
- worth the programming hassle of saving these bits since
- GENMAX is rarely that large in practice. */
-
- i = 0;
-
- do
- {
- randnum = shift_left (randnum) + buf[i];
- randmax = shift_left (randmax) + UCHAR_MAX;
- i++;
- }
- while (randmax < genmax);
- }
+ {
+ /* Calculate how many input bytes will be needed, and read
+ the bytes. */
+
+ size_t i = 0;
+ randint rmax = randmax;
+ unsigned char buf[sizeof randnum];
+
+ do
+ {
+ rmax = shift_left (rmax) + UCHAR_MAX;
+ i++;
+ }
+ while (rmax < genmax);
+
+ randread (source, buf, i);
+
+ /* Increase RANDMAX by appending random bytes to RANDNUM and
+ UCHAR_MAX to RANDMAX until RANDMAX is no less than
+ GENMAX. This may lose up to CHAR_BIT bits of information
+ if shift_right (RANDINT_MAX) < GENMAX, but it is not
+ worth the programming hassle of saving these bits since
+ GENMAX is rarely that large in practice. */
+
+ i = 0;
+
+ do
+ {
+ randnum = shift_left (randnum) + buf[i];
+ randmax = shift_left (randmax) + UCHAR_MAX;
+ i++;
+ }
+ while (randmax < genmax);
+ }
if (randmax == genmax)
- {
- s->randnum = s->randmax = 0;
- return randnum;
- }
+ {
+ s->randnum = s->randmax = 0;
+ return randnum;
+ }
else
- {
- /* GENMAX < RANDMAX, so attempt to generate a random number
- by taking RANDNUM modulo GENMAX+1. This will choose
- fairly so long as RANDNUM falls within an integral
- multiple of GENMAX+1; otherwise, LAST_USABLE_CHOICE < RANDNUM,
- so discard this attempt and try again.
-
- Since GENMAX cannot be RANDINT_MAX, CHOICES cannot be
- zero and there is no need to worry about dividing by
- zero. */
-
- randint excess_choices = randmax - genmax;
- randint unusable_choices = excess_choices % choices;
- randint last_usable_choice = randmax - unusable_choices;
- randint reduced_randnum = randnum % choices;
-
- if (randnum <= last_usable_choice)
- {
- s->randnum = randnum / choices;
- s->randmax = excess_choices / choices;
- return reduced_randnum;
- }
-
- /* Retry, but retain the randomness from the fact that RANDNUM fell
- into the range LAST_USABLE_CHOICE+1 .. RANDMAX. */
- randnum = reduced_randnum;
- randmax = unusable_choices - 1;
- }
+ {
+ /* GENMAX < RANDMAX, so attempt to generate a random number
+ by taking RANDNUM modulo GENMAX+1. This will choose
+ fairly so long as RANDNUM falls within an integral
+ multiple of GENMAX+1; otherwise, LAST_USABLE_CHOICE < RANDNUM,
+ so discard this attempt and try again.
+
+ Since GENMAX cannot be RANDINT_MAX, CHOICES cannot be
+ zero and there is no need to worry about dividing by
+ zero. */
+
+ randint excess_choices = randmax - genmax;
+ randint unusable_choices = excess_choices % choices;
+ randint last_usable_choice = randmax - unusable_choices;
+ randint reduced_randnum = randnum % choices;
+
+ if (randnum <= last_usable_choice)
+ {
+ s->randnum = randnum / choices;
+ s->randmax = excess_choices / choices;
+ return reduced_randnum;
+ }
+
+ /* Retry, but retain the randomness from the fact that RANDNUM fell
+ into the range LAST_USABLE_CHOICE+1 .. RANDMAX. */
+ randnum = reduced_randnum;
+ randmax = unusable_choices - 1;
+ }
}
}