1 1.8 dholland /* $NetBSD: random.c,v 1.8 2009/08/12 08:44:45 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.8 dholland __RCSID("$NetBSD: random.c,v 1.8 2009/08/12 08:44:45 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.8 dholland static long rrandom(void); 77 1.8 dholland 78 1.4 lukem void 79 1.7 dholland srrandom(int x) 80 1.1 cgd { 81 1.4 lukem int i; 82 1.1 cgd 83 1.7 dholland state[0] = x; 84 1.1 cgd if (rand_type != 0) { 85 1.1 cgd for (i = 1; i < rand_deg; i++) { 86 1.1 cgd state[i] = 1103515245 * state[i - 1] + 12345; 87 1.1 cgd } 88 1.1 cgd fptr = &state[rand_sep]; 89 1.1 cgd rptr = &state[0]; 90 1.1 cgd for (i = 0; i < 10 * rand_deg; i++) { 91 1.6 dholland (void)rrandom(); 92 1.1 cgd } 93 1.1 cgd } 94 1.1 cgd } 95 1.1 cgd 96 1.8 dholland static long 97 1.7 dholland rrandom(void) 98 1.1 cgd { 99 1.1 cgd long i; 100 1.6 dholland 101 1.1 cgd if (rand_type == 0) { 102 1.1 cgd i = state[0] = (state[0]*1103515245 + 12345) & 0x7fffffff; 103 1.1 cgd } else { 104 1.1 cgd *fptr += *rptr; 105 1.1 cgd i = (*fptr >> 1) & 0x7fffffff; 106 1.1 cgd if (++fptr >= end_ptr) { 107 1.1 cgd fptr = state; 108 1.1 cgd ++rptr; 109 1.1 cgd } else { 110 1.1 cgd if (++rptr >= end_ptr) { 111 1.1 cgd rptr = state; 112 1.1 cgd } 113 1.1 cgd } 114 1.1 cgd } 115 1.1 cgd return(i); 116 1.1 cgd } 117 1.1 cgd 118 1.4 lukem int 119 1.7 dholland get_rand(int x, int y) 120 1.1 cgd { 121 1.4 lukem int r, t; 122 1.1 cgd long lr; 123 1.1 cgd 124 1.1 cgd if (x > y) { 125 1.1 cgd t = y; 126 1.1 cgd y = x; 127 1.1 cgd x = t; 128 1.1 cgd } 129 1.1 cgd lr = rrandom(); 130 1.7 dholland lr &= 0x00003fffL; 131 1.6 dholland r = (int)lr; 132 1.1 cgd r = (r % ((y - x) + 1)) + x; 133 1.1 cgd return(r); 134 1.1 cgd } 135 1.1 cgd 136 1.4 lukem int 137 1.7 dholland rand_percent(int percentage) 138 1.1 cgd { 139 1.1 cgd return(get_rand(1, 100) <= percentage); 140 1.1 cgd } 141 1.1 cgd 142 1.4 lukem int 143 1.7 dholland coin_toss(void) 144 1.1 cgd { 145 1.1 cgd return(((rrandom() & 01) ? 1 : 0)); 146 1.1 cgd } 147