source: main/branches/64_bit_Greenstone/greenstone2/common-src/indexers/mg/lib/random.c@ 24031

Last change on this file since 24031 was 24031, checked in by jmt12, 13 years ago

Found mg indexing randomly broke on 64bit machines. Tracked it down to random.c and perf_hash.c. Replaced all occurances of 'long' (which is not well defined on 64 bit machines) with the more stable mg_s_long (mglong.h) to fix this issue.

  • Property svn:executable set to *
  • Property svn:keywords set to Author Date Id Revision
File size: 4.5 KB
RevLine 
[3745]1/**************************************************************************
2 *
3 * random.c -- pseudo random number generator
4 * Copyright (C) 1994 Chris Wallace ([email protected])
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19 *
20 **************************************************************************/
21
22/*
23 * A random number generator called as a function by
24 * random (iseed) or irandm (iseed)
25 * The parameter should be a pointer to a 2-element long vector.
26 * The first function returns a double uniform in 0 .. 1.
27 * The second returns a long integer uniform in 0 .. 2**31-1
28 * Both update iseed[] in exactly the same way.
29 * iseed[] must be a 2-element integer vector.
30 * The initial value of the second element may be anything.
31 *
32 * The period of the random sequence is 2**32 * (2**32-1)
33 * The table mt[0:127] is defined by mt[i] = 69069 ** (128-i)
34 */
[24031]35#include "random.h"
[3745]36
[24031]37#define MASK ((mg_s_long) 593970775)
[3745]38/* or in hex, 23674657 */
39
40#define SCALE ((double) 1.0 / (1024.0 * 1024.0 * 1024.0 * 2.0))
41/* i.e. 2 to power -31 */
42
[24031]43static mg_s_long mt [128] = {
[3745]44 902906369,
45 2030498053,
46 -473499623,
47 1640834941,
48 723406961,
49 1993558325,
50 -257162999,
51 -1627724755,
52 913952737,
53 278845029,
54 1327502073,
55 -1261253155,
56 981676113,
57 -1785280363,
58 1700077033,
59 366908557,
60 -1514479167,
61 -682799163,
62 141955545,
63 -830150595,
64 317871153,
65 1542036469,
66 -946413879,
67 -1950779155,
68 985397153,
69 626515237,
70 530871481,
71 783087261,
72 -1512358895,
73 1031357269,
74 -2007710807,
75 -1652747955,
76 -1867214463,
77 928251525,
78 1243003801,
79 -2132510467,
80 1874683889,
81 -717013323,
82 218254473,
83 -1628774995,
84 -2064896159,
85 69678053,
86 281568889,
87 -2104168611,
88 -165128239,
89 1536495125,
90 -39650967,
91 546594317,
92 -725987007,
93 1392966981,
94 1044706649,
95 687331773,
96 -2051306575,
97 1544302965,
98 -758494647,
99 -1243934099,
100 -75073759,
101 293132965,
102 -1935153095,
103 118929437,
104 807830417,
105 -1416222507,
106 -1550074071,
107 -84903219,
108 1355292929,
109 -380482555,
110 -1818444007,
111 -204797315,
112 170442609,
113 -1636797387,
114 868931593,
115 -623503571,
116 1711722209,
117 381210981,
118 -161547783,
119 -272740131,
120 -1450066095,
121 2116588437,
122 1100682473,
123 358442893,
124 -1529216831,
125 2116152005,
126 -776333095,
127 1265240893,
128 -482278607,
129 1067190005,
130 333444553,
131 86502381,
132 753481377,
133 39000101,
134 1779014585,
135 219658653,
136 -920253679,
137 2029538901,
138 1207761577,
139 -1515772851,
140 -236195711,
141 442620293,
142 423166617,
143 -1763648515,
144 -398436623,
145 -1749358155,
146 -538598519,
147 -652439379,
148 430550625,
149 -1481396507,
150 2093206905,
151 -1934691747,
152 -962631983,
153 1454463253,
154 -1877118871,
155 -291917555,
156 -1711673279,
157 201201733,
158 -474645415,
159 -96764739,
160 -1587365199,
161 1945705589,
162 1303896393,
163 1744831853,
164 381957665,
165 2135332261,
166 -55996615,
167 -1190135011,
168 1790562961,
169 -1493191723,
170 475559465,
171 69069
172 };
173
174double
[24031]175random (mg_s_long is [2])
[3745]176{
[24031]177 mg_s_long it, leh, nit;
[3745]178
179 it = is [0];
180 leh = is [1];
181 if (it <= 0)
182 it = (it + it) ^ MASK;
183 else
184 it = it + it;
185 nit = it - 1;
186/* to ensure all-ones pattern omitted */
187 leh = leh * mt[nit & 127] + nit;
188 is [0] = it; is [1] = leh;
189 if (leh < 0) leh = ~leh;
[24031]190 return (SCALE * ((mg_s_long) (leh | 1)));
[3745]191}
192
193
194
[24031]195mg_s_long
196irandm (mg_s_long is [2])
[3745]197{
[24031]198 mg_s_long it, leh, nit;
[3745]199
200 it = is [0];
201 leh = is [1];
202 if (it <= 0)
203 it = (it + it) ^ MASK;
204 else
205 it = it + it;
206 nit = it - 1;
207/* to ensure all-ones pattern omitted */
208 leh = leh * mt[nit & 127] + nit;
209 is [0] = it; is [1] = leh;
210 if (leh < 0) leh = ~leh;
211 return (leh);
212}
Note: See TracBrowser for help on using the repository browser.