1 /* NetHack 3.6 rnd.c $NHDT-Date: 1524689470 2018/04/25 20:51:10 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.18 $ */
2 /* Copyright (c) 2004 by Robert Patrick Rankin */
3 /* NetHack may be freely redistributed. See license for details. */
7 /* "Rand()"s definition is determined by [OS]conf.h */
8 #if defined(LINT) && defined(UNIX) /* rand() is long... */
9 extern int NDECL(rand);
10 #define RND(x) (rand() % x)
12 #if defined(UNIX) || defined(RANDOM)
13 #define RND(x) ((int) (Rand() % (long) (x)))
15 /* Good luck: the bottom order bits are cyclic. */
16 #define RND(x) ((int) ((Rand() >> 3) % (x)))
27 impossible("rn2(%d) attempted", x);
37 /* 0 <= rnl(x) < x; sometimes subtracting Luck;
38 good luck approaches 0, bad luck approaches (x-1) */
43 register int i, adjustment;
47 impossible("rnl(%d) attempted", x);
54 /* for small ranges, use Luck/3 (rounded away from 0);
55 also guard against architecture-specific differences
56 of integer division involving negative values */
57 adjustment = (abs(adjustment) + 1) / 3 * sgn(adjustment);
63 * -1,0,1 -> 0 (no adjustment)
72 if (adjustment && rn2(37 + abs(adjustment))) {
82 /* 1 <= rnd(x) <= x */
89 impossible("rnd(%d) attempted", x);
97 /* d(N,X) == NdX == dX+dX+...+dX N times; n <= d(n,x) <= (n*x) */
102 register int tmp = n;
105 if (x < 0 || n < 0 || (x == 0 && n != 0)) {
106 impossible("d(%d,%d) attempted", n, x);
112 return tmp; /* Alea iacta est. -- J.C. */
115 /* 1 <= rne(x) <= max(u.ulevel/3,5) */
120 register int tmp, utmp;
122 utmp = (u.ulevel < 15) ? 5 : u.ulevel / 3;
124 while (tmp < utmp && !rn2(x))
132 * return min(tmp, (u.ulevel < 15) ? 5 : u.ulevel / 3);
133 * which is clearer but less efficient and stands a vanishingly
134 * small chance of overflowing tmp
138 /* rnz: everyone's favorite! */
147 register long x = (long) i;
148 register long tmp = 1000L;