src/pkg/math/rand/rng.go - The Go Programming Language

Golang

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	}