random.c revision 1.7 1 1.7 dholland /* $NetBSD: random.c,v 1.7 2008/01/14 03:50:02 dholland Exp $ */
2 1.3 cgd
3 1.1 cgd /*
4 1.3 cgd * Copyright (c) 1988, 1993
5 1.3 cgd * The Regents of the University of California. All rights reserved.
6 1.1 cgd *
7 1.1 cgd * This code is derived from software contributed to Berkeley by
8 1.1 cgd * Timothy C. Stoehr.
9 1.1 cgd *
10 1.1 cgd * Redistribution and use in source and binary forms, with or without
11 1.1 cgd * modification, are permitted provided that the following conditions
12 1.1 cgd * are met:
13 1.1 cgd * 1. Redistributions of source code must retain the above copyright
14 1.1 cgd * notice, this list of conditions and the following disclaimer.
15 1.1 cgd * 2. Redistributions in binary form must reproduce the above copyright
16 1.1 cgd * notice, this list of conditions and the following disclaimer in the
17 1.1 cgd * documentation and/or other materials provided with the distribution.
18 1.5 agc * 3. Neither the name of the University nor the names of its contributors
19 1.1 cgd * may be used to endorse or promote products derived from this software
20 1.1 cgd * without specific prior written permission.
21 1.1 cgd *
22 1.1 cgd * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
23 1.1 cgd * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24 1.1 cgd * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25 1.1 cgd * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
26 1.1 cgd * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27 1.1 cgd * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28 1.1 cgd * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29 1.1 cgd * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30 1.1 cgd * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31 1.1 cgd * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32 1.1 cgd * SUCH DAMAGE.
33 1.1 cgd */
34 1.1 cgd
35 1.4 lukem #include <sys/cdefs.h>
36 1.1 cgd #ifndef lint
37 1.3 cgd #if 0
38 1.3 cgd static char sccsid[] = "@(#)random.c 8.1 (Berkeley) 5/31/93";
39 1.3 cgd #else
40 1.7 dholland __RCSID("$NetBSD: random.c,v 1.7 2008/01/14 03:50:02 dholland Exp $");
41 1.3 cgd #endif
42 1.1 cgd #endif /* not lint */
43 1.1 cgd
44 1.4 lukem #include "rogue.h"
45 1.4 lukem
46 1.1 cgd /*
47 1.1 cgd * random.c
48 1.1 cgd *
49 1.1 cgd * This source herein may be modified and/or distributed by anybody who
50 1.1 cgd * so desires, with the following restrictions:
51 1.1 cgd * 1.) No portion of this notice shall be removed.
52 1.1 cgd * 2.) Credit shall not be taken for the creation of this source.
53 1.1 cgd * 3.) This code is not to be traded, sold, or used for personal
54 1.1 cgd * gain or profit.
55 1.1 cgd *
56 1.1 cgd */
57 1.1 cgd
58 1.1 cgd static long rntb[32] = {
59 1.6 dholland 3, 0x9a319039, 0x32d9c024, 0x9b663182, 0x5da1f342,
60 1.1 cgd 0xde3b81e0, 0xdf0a6fb5, 0xf103bc02, 0x48f340fb, 0x7449e56b,
61 1.1 cgd 0xbeb1dbb0, 0xab5c5918, 0x946554fd, 0x8c2e680f, 0xeb3d799f,
62 1.1 cgd 0xb11ee0b7, 0x2d436b86, 0xda672e2a, 0x1588ca88, 0xe369735d,
63 1.6 dholland 0x904f35f7, 0xd7158fd6, 0x6fa6f051, 0x616e6b96, 0xac94efdc,
64 1.1 cgd 0x36413f93, 0xc622c298, 0xf5a42ab8, 0x8a88d77b, 0xf5ad9d0e,
65 1.1 cgd 0x8999220b, 0x27fb47b9
66 1.1 cgd };
67 1.1 cgd
68 1.1 cgd static long *fptr = &rntb[4];
69 1.1 cgd static long *rptr = &rntb[1];
70 1.1 cgd static long *state = &rntb[1];
71 1.1 cgd static int rand_type = 3;
72 1.1 cgd static int rand_deg = 31;
73 1.1 cgd static int rand_sep = 3;
74 1.1 cgd static long *end_ptr = &rntb[32];
75 1.1 cgd
76 1.4 lukem void
77 1.7 dholland srrandom(int x)
78 1.1 cgd {
79 1.4 lukem int i;
80 1.1 cgd
81 1.7 dholland state[0] = x;
82 1.1 cgd if (rand_type != 0) {
83 1.1 cgd for (i = 1; i < rand_deg; i++) {
84 1.1 cgd state[i] = 1103515245 * state[i - 1] + 12345;
85 1.1 cgd }
86 1.1 cgd fptr = &state[rand_sep];
87 1.1 cgd rptr = &state[0];
88 1.1 cgd for (i = 0; i < 10 * rand_deg; i++) {
89 1.6 dholland (void)rrandom();
90 1.1 cgd }
91 1.1 cgd }
92 1.1 cgd }
93 1.1 cgd
94 1.1 cgd long
95 1.7 dholland rrandom(void)
96 1.1 cgd {
97 1.1 cgd long i;
98 1.6 dholland
99 1.1 cgd if (rand_type == 0) {
100 1.1 cgd i = state[0] = (state[0]*1103515245 + 12345) & 0x7fffffff;
101 1.1 cgd } else {
102 1.1 cgd *fptr += *rptr;
103 1.1 cgd i = (*fptr >> 1) & 0x7fffffff;
104 1.1 cgd if (++fptr >= end_ptr) {
105 1.1 cgd fptr = state;
106 1.1 cgd ++rptr;
107 1.1 cgd } else {
108 1.1 cgd if (++rptr >= end_ptr) {
109 1.1 cgd rptr = state;
110 1.1 cgd }
111 1.1 cgd }
112 1.1 cgd }
113 1.1 cgd return(i);
114 1.1 cgd }
115 1.1 cgd
116 1.4 lukem int
117 1.7 dholland get_rand(int x, int y)
118 1.1 cgd {
119 1.4 lukem int r, t;
120 1.1 cgd long lr;
121 1.1 cgd
122 1.1 cgd if (x > y) {
123 1.1 cgd t = y;
124 1.1 cgd y = x;
125 1.1 cgd x = t;
126 1.1 cgd }
127 1.1 cgd lr = rrandom();
128 1.7 dholland lr &= 0x00003fffL;
129 1.6 dholland r = (int)lr;
130 1.1 cgd r = (r % ((y - x) + 1)) + x;
131 1.1 cgd return(r);
132 1.1 cgd }
133 1.1 cgd
134 1.4 lukem int
135 1.7 dholland rand_percent(int percentage)
136 1.1 cgd {
137 1.1 cgd return(get_rand(1, 100) <= percentage);
138 1.1 cgd }
139 1.1 cgd
140 1.4 lukem int
141 1.7 dholland coin_toss(void)
142 1.1 cgd {
143 1.1 cgd return(((rrandom() & 01) ? 1 : 0));
144 1.1 cgd }
145