Source file src/pkg/math/rand/rng.go
1 // Copyright 2009 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
4
5 package rand
6
7 /*
8 * Uniform distribution
9 *
10 * algorithm by
11 * DP Mitchell and JA Reeds
12 */
13
14 const (
15 _LEN = 607
16 _TAP = 273
17 _MAX = 1 << 63
18 _MASK = _MAX - 1
19 _A = 48271
20 _M = (1 << 31) - 1
21 _Q = 44488
22 _R = 3399
23 )
24
25 var (
26 // cooked random numbers
27 // the state of the rng
28 // after 780e10 iterations
29 rng_cooked [_LEN]int64 = [...]int64{
30 5041579894721019882, 4646389086726545243, 1395769623340756751, 5333664234075297259,
31 2875692520355975054, 9033628115061424579, 7143218595135194537, 4812947590706362721,
32 7937252194349799378, 5307299880338848416, 8209348851763925077, 2115741599318814044,
33 4593015457530856296, 8140875735541888011, 3319429241265089026, 8619815648190321034,
34 1727074043483619500, 113108499721038619, 4569519971459345583, 5062833859075314731,
35 2387618771259064424, 2716131344356686112, 6559392774825876886, 7650093201692370310,
36 7684323884043752161, 257867835996031390, 6593456519409015164, 271327514973697897,
37 2789386447340118284, 1065192797246149621, 3344507881999356393, 4459797941780066633,
38 7465081662728599889, 1014950805555097187, 4449440729345990775, 3481109366438502643,
39 2418672789110888383, 5796562887576294778, 4484266064449540171, 3738982361971787048,
40 4523597184512354423, 10530508058128498, 8633833783282346118, 2625309929628791628,
41 8660405965245884302, 10162832508971942, 6540714680961817391, 7031802312784620857,
42 6240911277345944669, 831864355460801054, 8004434137542152891, 2116287251661052151,
43 2202309800992166967, 9161020366945053561, 4069299552407763864, 4936383537992622449,
44 457351505131524928, 342195045928179354, 2847771682816600509, 2068020115986376518,
45 4368649989588021065, 887231587095185257, 5563591506886576496, 6816225200251950296,
46 5616972787034086048, 8471809303394836566, 1686575021641186857, 4045484338074262002,
47 4244156215201778923, 7848217333783577387, 5632136521049761902, 833283142057835272,
48 9029726508369077193, 3243583134664087292, 4316371101804477087, 8937849979965997980,
49 6446940406810434101, 1679342092332374735, 6050638460742422078, 6993520719509581582,
50 7640877852514293609, 5881353426285907985, 812786550756860885, 4541845584483343330,
51 2725470216277009086, 4980675660146853729, 5210769080603236061, 8894283318990530821,
52 6326442804750084282, 1495812843684243920, 7069751578799128019, 7370257291860230865,
53 6756929275356942261, 4706794511633873654, 7824520467827898663, 8549875090542453214,
54 33650829478596156, 1328918435751322643, 7297902601803624459, 1011190183918857495,
55 2238025036817854944, 5147159997473910359, 896512091560522982, 2659470849286379941,
56 6097729358393448602, 1731725986304753684, 4106255841983812711, 8327155210721535508,
57 8477511620686074402, 5803876044675762232, 8435417780860221662, 5988852856651071244,
58 4715837297103951910, 7566171971264485114, 505808562678895611, 5070098180695063370,
59 842110666775871513, 572156825025677802, 1791881013492340891, 3393267094866038768,
60 3778721850472236509, 2352769483186201278, 1292459583847367458, 8897907043675088419,
61 5781809037144163536, 2733958794029492513, 5092019688680754699, 8996124554772526841,
62 4234737173186232084, 5027558287275472836, 4635198586344772304, 8687338893267139351,
63 5907508150730407386, 784756255473944452, 972392927514829904, 5422057694808175112,
64 5158420642969283891, 9048531678558643225, 2407211146698877100, 7583282216521099569,
65 3940796514530962282, 3341174631045206375, 3095313889586102949, 7405321895688238710,
66 5832080132947175283, 7890064875145919662, 8184139210799583195, 1149859861409226130,
67 1464597243840211302, 4641648007187991873, 3516491885471466898, 956288521791657692,
68 6657089965014657519, 5220884358887979358, 1796677326474620641, 5340761970648932916,
69 1147977171614181568, 5066037465548252321, 2574765911837859848, 1085848279845204775,
70 3350107529868390359, 6116438694366558490, 2107701075971293812, 1803294065921269267,
71 2469478054175558874, 7368243281019965984, 3791908367843677526, 185046971116456637,
72 2257095756513439648, 7217693971077460129, 909049953079504259, 7196649268545224266,
73 5637660345400869599, 3955544945427965183, 8057528650917418961, 4139268440301127643,
74 6621926588513568059, 1373361136802681441, 6527366231383600011, 3507654575162700890,
75 9202058512774729859, 1954818376891585542, 6640380907130175705, 8299563319178235687,
76 3901867355218954373, 7046310742295574065, 6847195391333990232, 1572638100518868053,
77 8850422670118399721, 3631909142291992901, 5158881091950831288, 2882958317343121593,
78 4763258931815816403, 6280052734341785344, 4243789408204964850, 2043464728020827976,
79 6545300466022085465, 4562580375758598164, 5495451168795427352, 1738312861590151095,
80 553004618757816492, 6895160632757959823, 8233623922264685171, 7139506338801360852,
81 8550891222387991669, 5535668688139305547, 2430933853350256242, 5401941257863201076,
82 8159640039107728799, 6157493831600770366, 7632066283658143750, 6308328381617103346,
83 3681878764086140361, 3289686137190109749, 6587997200611086848, 244714774258135476,
84 4079788377417136100, 8090302575944624335, 2945117363431356361, 864324395848741045,
85 3009039260312620700, 8430027460082534031, 401084700045993341, 7254622446438694921,
86 4707864159563588614, 5640248530963493951, 5982507712689997893, 3315098242282210105,
87 5503847578771918426, 3941971367175193882, 8118566580304798074, 3839261274019871296,
88 7062410411742090847, 741381002980207668, 6027994129690250817, 2497829994150063930,
89 6251390334426228834, 1368930247903518833, 8809096399316380241, 6492004350391900708,
90 2462145737463489636, 404828418920299174, 4153026434231690595, 261785715255475940,
91 5464715384600071357, 592710404378763017, 6764129236657751224, 8513655718539357449,
92 5820343663801914208, 385298524683789911, 5224135003438199467, 6303131641338802145,
93 7150122561309371392, 368107899140673753, 3115186834558311558, 2915636353584281051,
94 4782583894627718279, 6718292300699989587, 8387085186914375220, 3387513132024756289,
95 4654329375432538231, 8930667561363381602, 5374373436876319273, 7623042350483453954,
96 7725442901813263321, 9186225467561587250, 4091027289597503355, 2357631606492579800,
97 2530936820058611833, 1636551876240043639, 5564664674334965799, 1452244145334316253,
98 2061642381019690829, 1279580266495294036, 9108481583171221009, 6023278686734049809,
99 5007630032676973346, 2153168792952589781, 6720334534964750538, 6041546491134794105,
100 3433922409283786309, 2285479922797300912, 3110614940896576130, 6366559590722842893,
101 5418791419666136509, 7163298419643543757, 4891138053923696990, 580618510277907015,
102 1684034065251686769, 4429514767357295841, 330346578555450005, 1119637995812174675,
103 7177515271653460134, 4589042248470800257, 7693288629059004563, 143607045258444228,
104 246994305896273627, 866417324803099287, 6473547110565816071, 3092379936208876896,
105 2058427839513754051, 5133784708526867938, 8785882556301281247, 6149332666841167611,
106 8585842181454472135, 6137678347805511274, 2070447184436970006, 5708223427705576541,
107 5999657892458244504, 4358391411789012426, 325123008708389849, 6837621693887290924,
108 4843721905315627004, 6010651222149276415, 5398352198963874652, 4602025990114250980,
109 1044646352569048800, 9106614159853161675, 829256115228593269, 4919284369102997000,
110 2681532557646850893, 3681559472488511871, 5307999518958214035, 6334130388442829274,
111 2658708232916537604, 1163313865052186287, 581945337509520675, 3648778920718647903,
112 4423673246306544414, 1620799783996955743, 220828013409515943, 8150384699999389761,
113 4287360518296753003, 4590000184845883843, 5513660857261085186, 6964829100392774275,
114 478991688350776035, 8746140185685648781, 228500091334420247, 1356187007457302238,
115 3019253992034194581, 3152601605678500003, 430152752706002213, 5559581553696971176,
116 4916432985369275664, 663574931734554391, 3420773838927732076, 2868348622579915573,
117 1999319134044418520, 3328689518636282723, 2587672709781371173, 1517255313529399333,
118 3092343956317362483, 3662252519007064108, 972445599196498113, 7664865435875959367,
119 1708913533482282562, 6917817162668868494, 3217629022545312900, 2570043027221707107,
120 8739788839543624613, 2488075924621352812, 4694002395387436668, 4559628481798514356,
121 2997203966153298104, 1282559373026354493, 240113143146674385, 8665713329246516443,
122 628141331766346752, 4571950817186770476, 1472811188152235408, 7596648026010355826,
123 6091219417754424743, 7834161864828164065, 7103445518877254909, 4390861237357459201,
124 4442653864240571734, 8903482404847331368, 622261699494173647, 6037261250297213248,
125 504404948065709118, 7275215526217113061, 1011176780856001400, 2194750105623461063,
126 2623071828615234808, 5157313728073836108, 3738405111966602044, 2539767524076729570,
127 2467284396349269342, 5256026990536851868, 7841086888628396109, 6640857538655893162,
128 1202087339038317498, 2113514992440715978, 7534350895342931403, 4925284734898484745,
129 5145623771477493805, 8225140880134972332, 2719520354384050532, 9132346697815513771,
130 4332154495710163773, 7137789594094346916, 6994721091344268833, 6667228574869048934,
131 655440045726677499, 59934747298466858, 6124974028078036405, 8957774780655365418,
132 2332206071942466437, 1701056712286369627, 3154897383618636503, 1637766181387607527,
133 2460521277767576533, 197309393502684135, 643677854385267315, 2543179307861934850,
134 4350769010207485119, 4754652089410667672, 2015595502641514512, 7999059458976458608,
135 4287946071480840813, 8362686366770308971, 6486469209321732151, 3617727845841796026,
136 7554353525834302244, 4450022655153542367, 1605195740213535749, 5327014565305508387,
137 4626575813550328320, 2692222020597705149, 241045573717249868, 5098046974627094010,
138 7916882295460730264, 884817090297530579, 5329160409530630596, 7790979528857726136,
139 4955070238059373407, 4918537275422674302, 3008076183950404629, 3007769226071157901,
140 2470346235617803020, 8928702772696731736, 7856187920214445904, 4474874585391974885,
141 7900176660600710914, 2140571127916226672, 2425445057265199971, 2486055153341847830,
142 4186670094382025798, 1883939007446035042, 8808666044074867985, 3734134241178479257,
143 4065968871360089196, 6953124200385847784, 1305686814738899057, 1637739099014457647,
144 3656125660947993209, 3966759634633167020, 3106378204088556331, 6328899822778449810,
145 4565385105440252958, 1979884289539493806, 2331793186920865425, 3783206694208922581,
146 8464961209802336085, 2843963751609577687, 3030678195484896323, 4793717574095772604,
147 4459239494808162889, 402587895800087237, 8057891408711167515, 4541888170938985079,
148 1042662272908816815, 5557303057122568958, 2647678726283249984, 2144477441549833761,
149 5806352215355387087, 7117771003473903623, 5916597177708541638, 462597715452321361,
150 8833658097025758785, 5970273481425315300, 563813119381731307, 2768349550652697015,
151 1598828206250873866, 5206393647403558110, 6235043485709261823, 3152217402014639496,
152 8469693267274066490, 125672920241807416, 5311079624024060938, 6663754932310491587,
153 8736848295048751716, 4488039774992061878, 5923302823487327109, 140891791083103236,
154 7414942793393574290, 7990420780896957397, 4317817392807076702, 3625184369705367340,
155 2740722765288122703, 5743100009702758344, 5997898640509039159, 8854493341352484163,
156 5242208035432907801, 701338899890987198, 7609280429197514109, 3020985755112334161,
157 6651322707055512866, 2635195723621160615, 5144520864246028816, 1035086515727829828,
158 1567242097116389047, 8172389260191636581, 6337820351429292273, 2163012566996458925,
159 2743190902890262681, 1906367633221323427, 6011544915663598137, 5932255307352610768,
160 2241128460406315459, 895504896216695588, 3094483003111372717, 4583857460292963101,
161 9079887171656594975, 8839289181930711403, 5762740387243057873, 4225072055348026230,
162 1838220598389033063, 3801620336801580414, 8823526620080073856, 1776617605585100335,
163 7899055018877642622, 5421679761463003041, 5521102963086275121, 4248279443559365898,
164 8735487530905098534, 1760527091573692978, 7142485049657745894, 8222656872927218123,
165 4969531564923704323, 3394475942196872480, 6424174453260338141, 359248545074932887,
166 3273651282831730598, 6797106199797138596, 3030918217665093212, 145600834617314036,
167 6036575856065626233, 740416251634527158, 7080427635449935582, 6951781370868335478,
168 399922722363687927, 294902314447253185, 7844950936339178523, 880320858634709042,
169 6192655680808675579, 411604686384710388, 9026808440365124461, 6440783557497587732,
170 4615674634722404292, 539897290441580544, 2096238225866883852, 8751955639408182687,
171 1907224908052289603, 7381039757301768559, 6157238513393239656, 7749994231914157575,
172 8629571604380892756, 5280433031239081479, 7101611890139813254, 2479018537985767835,
173 7169176924412769570, 7942066497793203302, 1357759729055557688, 2278447439451174845,
174 3625338785743880657, 6477479539006708521, 8976185375579272206, 5511371554711836120,
175 1326024180520890843, 7537449876596048829, 5464680203499696154, 3189671183162196045,
176 6346751753565857109, 241159987320630307, 3095793449658682053, 8978332846736310159,
177 2902794662273147216, 7208698530190629697, 7276901792339343736, 1732385229314443140,
178 4133292154170828382, 2918308698224194548, 1519461397937144458, 5293934712616591764,
179 4922828954023452664, 2879211533496425641, 5896236396443472108, 8465043815351752425,
180 7329020396871624740, 8915471717014488588, 2944902635677463047, 7052079073493465134,
181 8382142935188824023, 9103922860780351547, 4152330101494654406,
182 }
183 )
184
185 type rngSource struct {
186 tap int // index into vec
187 feed int // index into vec
188 vec [_LEN]int64 // current feedback register
189 }
190
191 // seed rng x[n+1] = 48271 * x[n] mod (2**31 - 1)
192 func seedrand(x int32) int32 {
193 hi := x / _Q
194 lo := x % _Q
195 x = _A*lo - _R*hi
196 if x < 0 {
197 x += _M
198 }
199 return x
200 }
201
202 // Seed uses the provided seed value to initialize the generator to a deterministic state.
203 func (rng *rngSource) Seed(seed int64) {
204 rng.tap = 0
205 rng.feed = _LEN - _TAP
206
207 seed = seed % _M
208 if seed < 0 {
209 seed += _M
210 }
211 if seed == 0 {
212 seed = 89482311
213 }
214
215 x := int32(seed)
216 for i := -20; i < _LEN; i++ {
217 x = seedrand(x)
218 if i >= 0 {
219 var u int64
220 u = int64(x) << 40
221 x = seedrand(x)
222 u ^= int64(x) << 20
223 x = seedrand(x)
224 u ^= int64(x)
225 u ^= rng_cooked[i]
226 rng.vec[i] = u & _MASK
227 }
228 }
229 }
230
231 // Int63 returns a non-negative pseudo-random 63-bit integer as an int64.
232 func (rng *rngSource) Int63() int64 {
233 rng.tap--
234 if rng.tap < 0 {
235 rng.tap += _LEN
236 }
237
238 rng.feed--
239 if rng.feed < 0 {
240 rng.feed += _LEN
241 }
242
243 x := (rng.vec[rng.feed] + rng.vec[rng.tap]) & _MASK
244 rng.vec[rng.feed] = x
245 return x
246 }