X-Git-Url: https://git.distorted.org.uk/u/mdw/catacomb/blobdiff_plain/07871354bfa8bbbacb6c6a1966f25b596119c146..c65df27983057ec76ed0e72bb370f9a5ae7dad28:/lcrand.c diff --git a/lcrand.c b/lcrand.c index 3686e17..15e94a8 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.5 2004/04/08 01:36:15 mdw Exp $ * * Simple linear congruential generator * @@ -27,14 +27,6 @@ * MA 02111-1307, USA. */ -/*----- Revision history --------------------------------------------------* - * - * $Log: lcrand.c,v $ - * Revision 1.1 1999/12/10 23:15:27 mdw - * Noncryptographic random number generator. - * - */ - /*----- Header files ------------------------------------------------------*/ #include @@ -172,7 +164,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 +193,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 +207,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 +246,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 };