X-Git-Url: https://git.distorted.org.uk/u/mdw/catacomb/blobdiff_plain/07871354bfa8bbbacb6c6a1966f25b596119c146..283b9af095a5b24ae71b49a6d2dcbdcdaae47c40:/lcrand.c diff --git a/lcrand.c b/lcrand.c index 3686e17..f53a3f2 100644 --- a/lcrand.c +++ b/lcrand.c @@ -1,6 +1,6 @@ /* -*-c-*- * - * $Id: lcrand.c,v 1.1 1999/12/10 23:15:27 mdw Exp $ + * $Id: lcrand.c,v 1.4 2000/12/06 20:31:06 mdw Exp $ * * Simple linear congruential generator * @@ -30,6 +30,15 @@ /*----- Revision history --------------------------------------------------* * * $Log: lcrand.c,v $ + * Revision 1.4 2000/12/06 20:31:06 mdw + * Simplify uniform range transformation. + * + * Revision 1.3 2000/06/17 11:29:03 mdw + * Add the flags word to the generic generator. + * + * Revision 1.2 1999/12/13 15:34:01 mdw + * Add support for seeding from a generic pseudorandom source. + * * Revision 1.1 1999/12/10 23:15:27 mdw * Noncryptographic random number generator. * @@ -172,7 +181,7 @@ uint32 lcrand_range(uint32 *x, uint32 m) uint32 r = P - P % m; do xx = lcrand(xx); while (xx >= r); *x = xx; - return (xx / (r / m)); + return (xx % m); } /*----- Generic interface -------------------------------------------------*/ @@ -201,6 +210,7 @@ static int gmisc(grand *r, unsigned op, ...) case GRAND_CHECK: case GRAND_SEEDINT: case GRAND_SEEDUINT32: + case GRAND_SEEDRAND: rc = 1; break; default: @@ -214,6 +224,12 @@ static int gmisc(grand *r, unsigned op, ...) case GRAND_SEEDUINT32: g->x = va_arg(ap, uint32); break; + case GRAND_SEEDRAND: { + grand *rr = va_arg(ap, grand *); + uint32 x; + do x = rr->ops->word(rr); while (x >= P || x == LCRAND_FIXEDPT); + g->x = x; + } break; default: GRAND_BADOP; break; @@ -247,7 +263,7 @@ static uint32 grange(grand *r, uint32 l) static const grand_ops gops = { "lcrand", - LCRAND_P, + LCRAND_P, 0, gmisc, gdestroy, graw, gbyte, grand_word, grange, grand_fill };