OSDN Git Service

Daily bump.
[pf3gnuchains/gcc-fork.git] / libgo / go / 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 }