[{"data":1,"prerenderedAt":1529},["ShallowReactive",2],{"guide-random-seed-reproducibility":3},{"id":4,"title":5,"body":6,"date":1521,"description":1522,"extension":1523,"meta":1524,"navigation":205,"path":1525,"readingTime":157,"seo":1526,"stem":1527,"__hash__":1528},"guides\u002Fguides\u002Frandom-seed-reproducibility.md","Random Seeds and Reproducibility",{"type":7,"value":8,"toc":1515},"minimark",[9,13,18,21,28,328,334,340,344,347,472,478,1105,1109,1112,1257,1260,1398,1402,1442,1503,1511],[10,11,12],"p",{},"True randomness is great for security tokens but terrible for reproducibility. When you write a unit test that depends on random values, run a Monte Carlo simulation that colleagues need to verify, or generate procedural content in a game that players share via seed codes, you need deterministic pseudorandomness. A seeded PRNG produces the same sequence of values every time you initialize it with the same seed, making random behavior reproducible.",[14,15,17],"h2",{"id":16},"why-reproducibility-matters","Why Reproducibility Matters",[10,19,20],{},"Three scenarios demand seeded randomness:",[10,22,23,27],{},[24,25,26],"strong",{},"Testing",": A randomized test that fails intermittently is a debugging nightmare. Fixed seeds let you reproduce the exact failure every time.",[29,30,35],"pre",{"className":31,"code":32,"language":33,"meta":34,"style":34},"language-javascript shiki shiki-themes github-light github-dark","\u002F\u002F Test with fixed seed — always reproducible\ntest('shuffle preserves all elements', () => {\n  const rng = new SeededPRNG(42)\n  const deck = [1, 2, 3, 4, 5]\n  const shuffled = fisherYatesShuffle(deck, rng)\n  expect(shuffled).toEqual([3, 1, 5, 2, 4])  \u002F\u002F Deterministic\n})\n\n\u002F\u002F Test with random seed logged on failure — reproducible after the fact\ntest('randomized partition invariant', () => {\n  const seed =.Date.now()\n  const rng = new SeededPRNG(seed)\n  try {\n    \u002F\u002F ... test logic using rng ...\n  } catch (e) {\n    e.message += ` (seed: ${seed})`\n    throw e\n  }\n})\n","javascript","",[36,37,38,47,72,99,139,155,194,200,207,213,229,248,264,272,278,290,308,317,323],"code",{"__ignoreMap":34},[39,40,43],"span",{"class":41,"line":42},"line",1,[39,44,46],{"class":45},"sJ8bj","\u002F\u002F Test with fixed seed — always reproducible\n",[39,48,50,54,58,62,65,69],{"class":41,"line":49},2,[39,51,53],{"class":52},"sScJk","test",[39,55,57],{"class":56},"sVt8B","(",[39,59,61],{"class":60},"sZZnC","'shuffle preserves all elements'",[39,63,64],{"class":56},", () ",[39,66,68],{"class":67},"szBVR","=>",[39,70,71],{"class":56}," {\n",[39,73,75,78,82,85,88,91,93,96],{"class":41,"line":74},3,[39,76,77],{"class":67},"  const",[39,79,81],{"class":80},"sj4cs"," rng",[39,83,84],{"class":67}," =",[39,86,87],{"class":67}," new",[39,89,90],{"class":52}," SeededPRNG",[39,92,57],{"class":56},[39,94,95],{"class":80},"42",[39,97,98],{"class":56},")\n",[39,100,102,104,107,109,112,115,118,121,123,126,128,131,133,136],{"class":41,"line":101},4,[39,103,77],{"class":67},[39,105,106],{"class":80}," deck",[39,108,84],{"class":67},[39,110,111],{"class":56}," [",[39,113,114],{"class":80},"1",[39,116,117],{"class":56},", ",[39,119,120],{"class":80},"2",[39,122,117],{"class":56},[39,124,125],{"class":80},"3",[39,127,117],{"class":56},[39,129,130],{"class":80},"4",[39,132,117],{"class":56},[39,134,135],{"class":80},"5",[39,137,138],{"class":56},"]\n",[39,140,142,144,147,149,152],{"class":41,"line":141},5,[39,143,77],{"class":67},[39,145,146],{"class":80}," shuffled",[39,148,84],{"class":67},[39,150,151],{"class":52}," fisherYatesShuffle",[39,153,154],{"class":56},"(deck, rng)\n",[39,156,158,161,164,167,170,172,174,176,178,180,182,184,186,188,191],{"class":41,"line":157},6,[39,159,160],{"class":52},"  expect",[39,162,163],{"class":56},"(shuffled).",[39,165,166],{"class":52},"toEqual",[39,168,169],{"class":56},"([",[39,171,125],{"class":80},[39,173,117],{"class":56},[39,175,114],{"class":80},[39,177,117],{"class":56},[39,179,135],{"class":80},[39,181,117],{"class":56},[39,183,120],{"class":80},[39,185,117],{"class":56},[39,187,130],{"class":80},[39,189,190],{"class":56},"])  ",[39,192,193],{"class":45},"\u002F\u002F Deterministic\n",[39,195,197],{"class":41,"line":196},7,[39,198,199],{"class":56},"})\n",[39,201,203],{"class":41,"line":202},8,[39,204,206],{"emptyLinePlaceholder":205},true,"\n",[39,208,210],{"class":41,"line":209},9,[39,211,212],{"class":45},"\u002F\u002F Test with random seed logged on failure — reproducible after the fact\n",[39,214,216,218,220,223,225,227],{"class":41,"line":215},10,[39,217,53],{"class":52},[39,219,57],{"class":56},[39,221,222],{"class":60},"'randomized partition invariant'",[39,224,64],{"class":56},[39,226,68],{"class":67},[39,228,71],{"class":56},[39,230,232,234,237,239,242,245],{"class":41,"line":231},11,[39,233,77],{"class":67},[39,235,236],{"class":80}," seed",[39,238,84],{"class":67},[39,240,241],{"class":56},".Date.",[39,243,244],{"class":52},"now",[39,246,247],{"class":56},"()\n",[39,249,251,253,255,257,259,261],{"class":41,"line":250},12,[39,252,77],{"class":67},[39,254,81],{"class":80},[39,256,84],{"class":67},[39,258,87],{"class":67},[39,260,90],{"class":52},[39,262,263],{"class":56},"(seed)\n",[39,265,267,270],{"class":41,"line":266},13,[39,268,269],{"class":67},"  try",[39,271,71],{"class":56},[39,273,275],{"class":41,"line":274},14,[39,276,277],{"class":45},"    \u002F\u002F ... test logic using rng ...\n",[39,279,281,284,287],{"class":41,"line":280},15,[39,282,283],{"class":56},"  } ",[39,285,286],{"class":67},"catch",[39,288,289],{"class":56}," (e) {\n",[39,291,293,296,299,302,305],{"class":41,"line":292},16,[39,294,295],{"class":56},"    e.message ",[39,297,298],{"class":67},"+=",[39,300,301],{"class":60}," ` (seed: ${",[39,303,304],{"class":56},"seed",[39,306,307],{"class":60},"})`\n",[39,309,311,314],{"class":41,"line":310},17,[39,312,313],{"class":67},"    throw",[39,315,316],{"class":56}," e\n",[39,318,320],{"class":41,"line":319},18,[39,321,322],{"class":56},"  }\n",[39,324,326],{"class":41,"line":325},19,[39,327,199],{"class":56},[10,329,330,333],{},[24,331,332],{},"Simulations",": Scientific and financial simulations must be reproducible for peer review and regulatory compliance. If your Monte Carlo simulation produces different results every run, no one can verify your conclusions.",[10,335,336,339],{},[24,337,338],{},"Game development",": Games like Minecraft use world seeds so players can share identical procedurally generated worlds. The same seed always produces the same terrain, structures, and biome distribution.",[14,341,343],{"id":342},"choosing-a-prng-algorithm","Choosing a PRNG Algorithm",[10,345,346],{},"Not all PRNGs are equal. Here is how the common options compare:",[348,349,350,372],"table",{},[351,352,353],"thead",{},[354,355,356,360,363,366,369],"tr",{},[357,358,359],"th",{},"Algorithm",[357,361,362],{},"Period",[357,364,365],{},"Speed",[357,367,368],{},"Statistical Quality",[357,370,371],{},"Use Case",[373,374,375,393,409,425,442,457],"tbody",{},[354,376,377,381,384,387,390],{},[378,379,380],"td",{},"LCG (linear congruential)",[378,382,383],{},"2³²",[378,385,386],{},"Very fast",[378,388,389],{},"Poor",[378,391,392],{},"Avoid",[354,394,395,398,401,403,406],{},[378,396,397],{},"xorshift32",[378,399,400],{},"2³²−1",[378,402,386],{},[378,404,405],{},"Moderate",[378,407,408],{},"Simple games",[354,410,411,414,417,419,422],{},[378,412,413],{},"xorshift128+",[378,415,416],{},"2¹²⁸−1",[378,418,386],{},[378,420,421],{},"Good",[378,423,424],{},"General purpose",[354,426,427,430,433,436,439],{},[378,428,429],{},"PCG32",[378,431,432],{},"2⁶⁴",[378,434,435],{},"Fast",[378,437,438],{},"Excellent",[378,440,441],{},"Recommended",[354,443,444,447,450,452,454],{},[378,445,446],{},"Mersenne Twister (MT19937)",[378,448,449],{},"2¹⁹⁹³⁷−1",[378,451,405],{},[378,453,438],{},[378,455,456],{},"Scientific computing",[354,458,459,462,465,467,469],{},[378,460,461],{},"xoshiro256**",[378,463,464],{},"2²⁵⁶−1",[378,466,386],{},[378,468,438],{},[378,470,471],{},"Modern standard",[10,473,474,475,477],{},"For JavaScript applications, ",[36,476,461],{}," provides the best balance of speed, quality, and reasonable state size. Here is a compact implementation:",[29,479,481],{"className":31,"code":480,"language":33,"meta":34,"style":34},"class Xoshiro256SS {\n  constructor(seed) {\n    \u002F\u002F SplitMix32 to expand seed into 4 state values\n    this.state = [0, 0, 0, 0]\n    for (let i = 0; i \u003C 4; i++) {\n      seed += 0x9e3779b9\n      let t = seed ^ (seed >>> 16)\n      t = Math.imul(t, 0x21f0aaad)\n      t ^= t >>> 15\n      t = Math.imul(t, 0x735a2d97)\n      t ^= t >>> 15\n      this.state[i] = t >>> 0\n    }\n  }\n\n  next() {\n    const [s0, s1, s2, s3] = this.state\n    const result = Math.imul(s1, 5) >>> 0\n    const rotated = ((result \u003C\u003C 7) | (result >>> 25)) >>> 0\n\n    const t = (s1 \u003C\u003C 17) >>> 0\n    this.state[2] = (this.state[2] ^ t) >>> 0\n    this.state[0] = (s0 ^ s2) >>> 0\n    this.state[1] = (s1 ^ s3) >>> 0\n    this.state[2] = (s2 ^ s0) >>> 0\n    this.state[3] = (s3 ^ s1) >>> 0\n\n    this.state[0] = (this.state[0] ^ (this.state[0] >>> 16)) >>> 0\n\n    return (rotated >>> 0) \u002F 4294967296\n  }\n}\n\nconst rng = new Xoshiro256SS(12345)\nrng.next()  \u002F\u002F 0.4690172740712762 — same every time with seed 12345\n",[36,482,483,493,506,511,541,577,587,614,635,649,666,678,695,700,704,708,716,752,777,815,820,844,878,903,927,952,977,982,1027,1032,1053,1058,1064,1069,1090],{"__ignoreMap":34},[39,484,485,488,491],{"class":41,"line":42},[39,486,487],{"class":67},"class",[39,489,490],{"class":52}," Xoshiro256SS",[39,492,71],{"class":56},[39,494,495,498,500,503],{"class":41,"line":49},[39,496,497],{"class":67},"  constructor",[39,499,57],{"class":56},[39,501,304],{"class":502},"s4XuR",[39,504,505],{"class":56},") {\n",[39,507,508],{"class":41,"line":74},[39,509,510],{"class":45},"    \u002F\u002F SplitMix32 to expand seed into 4 state values\n",[39,512,513,516,519,522,524,527,529,531,533,535,537,539],{"class":41,"line":101},[39,514,515],{"class":80},"    this",[39,517,518],{"class":56},".state ",[39,520,521],{"class":67},"=",[39,523,111],{"class":56},[39,525,526],{"class":80},"0",[39,528,117],{"class":56},[39,530,526],{"class":80},[39,532,117],{"class":56},[39,534,526],{"class":80},[39,536,117],{"class":56},[39,538,526],{"class":80},[39,540,138],{"class":56},[39,542,543,546,549,552,555,557,560,563,566,569,572,575],{"class":41,"line":141},[39,544,545],{"class":67},"    for",[39,547,548],{"class":56}," (",[39,550,551],{"class":67},"let",[39,553,554],{"class":56}," i ",[39,556,521],{"class":67},[39,558,559],{"class":80}," 0",[39,561,562],{"class":56},"; i ",[39,564,565],{"class":67},"\u003C",[39,567,568],{"class":80}," 4",[39,570,571],{"class":56},"; i",[39,573,574],{"class":67},"++",[39,576,505],{"class":56},[39,578,579,582,584],{"class":41,"line":157},[39,580,581],{"class":56},"      seed ",[39,583,298],{"class":67},[39,585,586],{"class":80}," 0x9e3779b9\n",[39,588,589,592,595,597,600,603,606,609,612],{"class":41,"line":196},[39,590,591],{"class":67},"      let",[39,593,594],{"class":56}," t ",[39,596,521],{"class":67},[39,598,599],{"class":56}," seed ",[39,601,602],{"class":67},"^",[39,604,605],{"class":56}," (seed ",[39,607,608],{"class":67},">>>",[39,610,611],{"class":80}," 16",[39,613,98],{"class":56},[39,615,616,619,621,624,627,630,633],{"class":41,"line":202},[39,617,618],{"class":56},"      t ",[39,620,521],{"class":67},[39,622,623],{"class":56}," Math.",[39,625,626],{"class":52},"imul",[39,628,629],{"class":56},"(t, ",[39,631,632],{"class":80},"0x21f0aaad",[39,634,98],{"class":56},[39,636,637,639,642,644,646],{"class":41,"line":209},[39,638,618],{"class":56},[39,640,641],{"class":67},"^=",[39,643,594],{"class":56},[39,645,608],{"class":67},[39,647,648],{"class":80}," 15\n",[39,650,651,653,655,657,659,661,664],{"class":41,"line":215},[39,652,618],{"class":56},[39,654,521],{"class":67},[39,656,623],{"class":56},[39,658,626],{"class":52},[39,660,629],{"class":56},[39,662,663],{"class":80},"0x735a2d97",[39,665,98],{"class":56},[39,667,668,670,672,674,676],{"class":41,"line":231},[39,669,618],{"class":56},[39,671,641],{"class":67},[39,673,594],{"class":56},[39,675,608],{"class":67},[39,677,648],{"class":80},[39,679,680,683,686,688,690,692],{"class":41,"line":250},[39,681,682],{"class":80},"      this",[39,684,685],{"class":56},".state[i] ",[39,687,521],{"class":67},[39,689,594],{"class":56},[39,691,608],{"class":67},[39,693,694],{"class":80}," 0\n",[39,696,697],{"class":41,"line":266},[39,698,699],{"class":56},"    }\n",[39,701,702],{"class":41,"line":274},[39,703,322],{"class":56},[39,705,706],{"class":41,"line":280},[39,707,206],{"emptyLinePlaceholder":205},[39,709,710,713],{"class":41,"line":292},[39,711,712],{"class":52},"  next",[39,714,715],{"class":56},"() {\n",[39,717,718,721,723,726,728,731,733,736,738,741,744,746,749],{"class":41,"line":310},[39,719,720],{"class":67},"    const",[39,722,111],{"class":56},[39,724,725],{"class":80},"s0",[39,727,117],{"class":56},[39,729,730],{"class":80},"s1",[39,732,117],{"class":56},[39,734,735],{"class":80},"s2",[39,737,117],{"class":56},[39,739,740],{"class":80},"s3",[39,742,743],{"class":56},"] ",[39,745,521],{"class":67},[39,747,748],{"class":80}," this",[39,750,751],{"class":56},".state\n",[39,753,754,756,759,761,763,765,768,770,773,775],{"class":41,"line":319},[39,755,720],{"class":67},[39,757,758],{"class":80}," result",[39,760,84],{"class":67},[39,762,623],{"class":56},[39,764,626],{"class":52},[39,766,767],{"class":56},"(s1, ",[39,769,135],{"class":80},[39,771,772],{"class":56},") ",[39,774,608],{"class":67},[39,776,694],{"class":80},[39,778,779,781,784,786,789,792,795,797,800,803,805,808,811,813],{"class":41,"line":325},[39,780,720],{"class":67},[39,782,783],{"class":80}," rotated",[39,785,84],{"class":67},[39,787,788],{"class":56}," ((result ",[39,790,791],{"class":67},"\u003C\u003C",[39,793,794],{"class":80}," 7",[39,796,772],{"class":56},[39,798,799],{"class":67},"|",[39,801,802],{"class":56}," (result ",[39,804,608],{"class":67},[39,806,807],{"class":80}," 25",[39,809,810],{"class":56},")) ",[39,812,608],{"class":67},[39,814,694],{"class":80},[39,816,818],{"class":41,"line":817},20,[39,819,206],{"emptyLinePlaceholder":205},[39,821,823,825,828,830,833,835,838,840,842],{"class":41,"line":822},21,[39,824,720],{"class":67},[39,826,827],{"class":80}," t",[39,829,84],{"class":67},[39,831,832],{"class":56}," (s1 ",[39,834,791],{"class":67},[39,836,837],{"class":80}," 17",[39,839,772],{"class":56},[39,841,608],{"class":67},[39,843,694],{"class":80},[39,845,847,849,852,854,856,858,860,863,865,867,869,871,874,876],{"class":41,"line":846},22,[39,848,515],{"class":80},[39,850,851],{"class":56},".state[",[39,853,120],{"class":80},[39,855,743],{"class":56},[39,857,521],{"class":67},[39,859,548],{"class":56},[39,861,862],{"class":80},"this",[39,864,851],{"class":56},[39,866,120],{"class":80},[39,868,743],{"class":56},[39,870,602],{"class":67},[39,872,873],{"class":56}," t) ",[39,875,608],{"class":67},[39,877,694],{"class":80},[39,879,881,883,885,887,889,891,894,896,899,901],{"class":41,"line":880},23,[39,882,515],{"class":80},[39,884,851],{"class":56},[39,886,526],{"class":80},[39,888,743],{"class":56},[39,890,521],{"class":67},[39,892,893],{"class":56}," (s0 ",[39,895,602],{"class":67},[39,897,898],{"class":56}," s2) ",[39,900,608],{"class":67},[39,902,694],{"class":80},[39,904,906,908,910,912,914,916,918,920,923,925],{"class":41,"line":905},24,[39,907,515],{"class":80},[39,909,851],{"class":56},[39,911,114],{"class":80},[39,913,743],{"class":56},[39,915,521],{"class":67},[39,917,832],{"class":56},[39,919,602],{"class":67},[39,921,922],{"class":56}," s3) ",[39,924,608],{"class":67},[39,926,694],{"class":80},[39,928,930,932,934,936,938,940,943,945,948,950],{"class":41,"line":929},25,[39,931,515],{"class":80},[39,933,851],{"class":56},[39,935,120],{"class":80},[39,937,743],{"class":56},[39,939,521],{"class":67},[39,941,942],{"class":56}," (s2 ",[39,944,602],{"class":67},[39,946,947],{"class":56}," s0) ",[39,949,608],{"class":67},[39,951,694],{"class":80},[39,953,955,957,959,961,963,965,968,970,973,975],{"class":41,"line":954},26,[39,956,515],{"class":80},[39,958,851],{"class":56},[39,960,125],{"class":80},[39,962,743],{"class":56},[39,964,521],{"class":67},[39,966,967],{"class":56}," (s3 ",[39,969,602],{"class":67},[39,971,972],{"class":56}," s1) ",[39,974,608],{"class":67},[39,976,694],{"class":80},[39,978,980],{"class":41,"line":979},27,[39,981,206],{"emptyLinePlaceholder":205},[39,983,985,987,989,991,993,995,997,999,1001,1003,1005,1007,1009,1011,1013,1015,1017,1019,1021,1023,1025],{"class":41,"line":984},28,[39,986,515],{"class":80},[39,988,851],{"class":56},[39,990,526],{"class":80},[39,992,743],{"class":56},[39,994,521],{"class":67},[39,996,548],{"class":56},[39,998,862],{"class":80},[39,1000,851],{"class":56},[39,1002,526],{"class":80},[39,1004,743],{"class":56},[39,1006,602],{"class":67},[39,1008,548],{"class":56},[39,1010,862],{"class":80},[39,1012,851],{"class":56},[39,1014,526],{"class":80},[39,1016,743],{"class":56},[39,1018,608],{"class":67},[39,1020,611],{"class":80},[39,1022,810],{"class":56},[39,1024,608],{"class":67},[39,1026,694],{"class":80},[39,1028,1030],{"class":41,"line":1029},29,[39,1031,206],{"emptyLinePlaceholder":205},[39,1033,1035,1038,1041,1043,1045,1047,1050],{"class":41,"line":1034},30,[39,1036,1037],{"class":67},"    return",[39,1039,1040],{"class":56}," (rotated ",[39,1042,608],{"class":67},[39,1044,559],{"class":80},[39,1046,772],{"class":56},[39,1048,1049],{"class":67},"\u002F",[39,1051,1052],{"class":80}," 4294967296\n",[39,1054,1056],{"class":41,"line":1055},31,[39,1057,322],{"class":56},[39,1059,1061],{"class":41,"line":1060},32,[39,1062,1063],{"class":56},"}\n",[39,1065,1067],{"class":41,"line":1066},33,[39,1068,206],{"emptyLinePlaceholder":205},[39,1070,1072,1075,1077,1079,1081,1083,1085,1088],{"class":41,"line":1071},34,[39,1073,1074],{"class":67},"const",[39,1076,81],{"class":80},[39,1078,84],{"class":67},[39,1080,87],{"class":67},[39,1082,490],{"class":52},[39,1084,57],{"class":56},[39,1086,1087],{"class":80},"12345",[39,1089,98],{"class":56},[39,1091,1093,1096,1099,1102],{"class":41,"line":1092},35,[39,1094,1095],{"class":56},"rng.",[39,1097,1098],{"class":52},"next",[39,1100,1101],{"class":56},"()  ",[39,1103,1104],{"class":45},"\u002F\u002F 0.4690172740712762 — same every time with seed 12345\n",[14,1106,1108],{"id":1107},"seed-generation-and-management","Seed Generation and Management",[10,1110,1111],{},"The seed itself should be random in production but fixed in tests. A common pattern:",[29,1113,1115],{"className":31,"code":1114,"language":33,"meta":34,"style":34},"const DEFAULT_SEED = 42\n\nfunction createRNG(overrides = {}) {\n  const seed = overrides.seed ?? DEFAULT_SEED\n  return new Xoshiro256SS(seed)\n}\n\n\u002F\u002F Production: random seed\nconst productionRNG = createRNG({ seed: crypto.getRandomValues(new Uint32Array(1))[0] })\n\n\u002F\u002F Testing: fixed seed\nconst testRNG = createRNG({ seed: 42 })\n",[36,1116,1117,1129,1133,1151,1168,1179,1183,1187,1192,1229,1233,1238],{"__ignoreMap":34},[39,1118,1119,1121,1124,1126],{"class":41,"line":42},[39,1120,1074],{"class":67},[39,1122,1123],{"class":80}," DEFAULT_SEED",[39,1125,84],{"class":67},[39,1127,1128],{"class":80}," 42\n",[39,1130,1131],{"class":41,"line":49},[39,1132,206],{"emptyLinePlaceholder":205},[39,1134,1135,1138,1141,1143,1146,1148],{"class":41,"line":74},[39,1136,1137],{"class":67},"function",[39,1139,1140],{"class":52}," createRNG",[39,1142,57],{"class":56},[39,1144,1145],{"class":502},"overrides",[39,1147,84],{"class":67},[39,1149,1150],{"class":56}," {}) {\n",[39,1152,1153,1155,1157,1159,1162,1165],{"class":41,"line":101},[39,1154,77],{"class":67},[39,1156,236],{"class":80},[39,1158,84],{"class":67},[39,1160,1161],{"class":56}," overrides.seed ",[39,1163,1164],{"class":67},"??",[39,1166,1167],{"class":80}," DEFAULT_SEED\n",[39,1169,1170,1173,1175,1177],{"class":41,"line":141},[39,1171,1172],{"class":67},"  return",[39,1174,87],{"class":67},[39,1176,490],{"class":52},[39,1178,263],{"class":56},[39,1180,1181],{"class":41,"line":157},[39,1182,1063],{"class":56},[39,1184,1185],{"class":41,"line":196},[39,1186,206],{"emptyLinePlaceholder":205},[39,1188,1189],{"class":41,"line":202},[39,1190,1191],{"class":45},"\u002F\u002F Production: random seed\n",[39,1193,1194,1196,1199,1201,1203,1206,1209,1211,1214,1217,1219,1221,1224,1226],{"class":41,"line":209},[39,1195,1074],{"class":67},[39,1197,1198],{"class":80}," productionRNG",[39,1200,84],{"class":67},[39,1202,1140],{"class":52},[39,1204,1205],{"class":56},"({ seed: crypto.",[39,1207,1208],{"class":52},"getRandomValues",[39,1210,57],{"class":56},[39,1212,1213],{"class":67},"new",[39,1215,1216],{"class":52}," Uint32Array",[39,1218,57],{"class":56},[39,1220,114],{"class":80},[39,1222,1223],{"class":56},"))[",[39,1225,526],{"class":80},[39,1227,1228],{"class":56},"] })\n",[39,1230,1231],{"class":41,"line":215},[39,1232,206],{"emptyLinePlaceholder":205},[39,1234,1235],{"class":41,"line":231},[39,1236,1237],{"class":45},"\u002F\u002F Testing: fixed seed\n",[39,1239,1240,1242,1245,1247,1249,1252,1254],{"class":41,"line":250},[39,1241,1074],{"class":67},[39,1243,1244],{"class":80}," testRNG",[39,1246,84],{"class":67},[39,1248,1140],{"class":52},[39,1250,1251],{"class":56},"({ seed: ",[39,1253,95],{"class":80},[39,1255,1256],{"class":56}," })\n",[10,1258,1259],{},"For simulations that run across multiple machines, store the seed alongside results:",[29,1261,1263],{"className":31,"code":1262,"language":33,"meta":34,"style":34},"function runSimulation(config) {\n  const seed = crypto.getRandomValues(new Uint32Array(1))[0]\n  const rng = new Xoshiro256SS(seed)\n  const results = computeModel(rng, config)\n\n  return {\n    seed,       \u002F\u002F Required for reproduction\n    config,     \u002F\u002F Full configuration\n    results,    \u002F\u002F Output data\n    timestamp: new Date().toISOString(),\n  }\n}\n",[36,1264,1265,1279,1308,1322,1337,1341,1347,1355,1363,1371,1390,1394],{"__ignoreMap":34},[39,1266,1267,1269,1272,1274,1277],{"class":41,"line":42},[39,1268,1137],{"class":67},[39,1270,1271],{"class":52}," runSimulation",[39,1273,57],{"class":56},[39,1275,1276],{"class":502},"config",[39,1278,505],{"class":56},[39,1280,1281,1283,1285,1287,1290,1292,1294,1296,1298,1300,1302,1304,1306],{"class":41,"line":49},[39,1282,77],{"class":67},[39,1284,236],{"class":80},[39,1286,84],{"class":67},[39,1288,1289],{"class":56}," crypto.",[39,1291,1208],{"class":52},[39,1293,57],{"class":56},[39,1295,1213],{"class":67},[39,1297,1216],{"class":52},[39,1299,57],{"class":56},[39,1301,114],{"class":80},[39,1303,1223],{"class":56},[39,1305,526],{"class":80},[39,1307,138],{"class":56},[39,1309,1310,1312,1314,1316,1318,1320],{"class":41,"line":74},[39,1311,77],{"class":67},[39,1313,81],{"class":80},[39,1315,84],{"class":67},[39,1317,87],{"class":67},[39,1319,490],{"class":52},[39,1321,263],{"class":56},[39,1323,1324,1326,1329,1331,1334],{"class":41,"line":101},[39,1325,77],{"class":67},[39,1327,1328],{"class":80}," results",[39,1330,84],{"class":67},[39,1332,1333],{"class":52}," computeModel",[39,1335,1336],{"class":56},"(rng, config)\n",[39,1338,1339],{"class":41,"line":141},[39,1340,206],{"emptyLinePlaceholder":205},[39,1342,1343,1345],{"class":41,"line":157},[39,1344,1172],{"class":67},[39,1346,71],{"class":56},[39,1348,1349,1352],{"class":41,"line":196},[39,1350,1351],{"class":56},"    seed,       ",[39,1353,1354],{"class":45},"\u002F\u002F Required for reproduction\n",[39,1356,1357,1360],{"class":41,"line":202},[39,1358,1359],{"class":56},"    config,     ",[39,1361,1362],{"class":45},"\u002F\u002F Full configuration\n",[39,1364,1365,1368],{"class":41,"line":209},[39,1366,1367],{"class":56},"    results,    ",[39,1369,1370],{"class":45},"\u002F\u002F Output data\n",[39,1372,1373,1376,1378,1381,1384,1387],{"class":41,"line":215},[39,1374,1375],{"class":56},"    timestamp: ",[39,1377,1213],{"class":67},[39,1379,1380],{"class":52}," Date",[39,1382,1383],{"class":56},"().",[39,1385,1386],{"class":52},"toISOString",[39,1388,1389],{"class":56},"(),\n",[39,1391,1392],{"class":41,"line":231},[39,1393,322],{"class":56},[39,1395,1396],{"class":41,"line":250},[39,1397,1063],{"class":56},[14,1399,1401],{"id":1400},"common-pitfalls","Common Pitfalls",[1403,1404,1405,1420,1426,1436],"ul",{},[1406,1407,1408,1411,1412,1415,1416,1419],"li",{},[24,1409,1410],{},"Seeding with timestamps",": Using ",[36,1413,1414],{},"Date.now()"," as a seed produces different values per millisecond, but two simulations started in the same millisecond share a seed. Use ",[36,1417,1418],{},"crypto.getRandomValues()"," for production seeds instead.",[1406,1421,1422,1425],{},[24,1423,1424],{},"State mutation across tests",": If you share a single PRNG instance across tests, the second test depends on how many values the first test consumed. Create a fresh PRNG per test.",[1406,1427,1428,1431,1432,1435],{},[24,1429,1430],{},"Floating-point precision",": Different languages handle float conversion differently. ",[36,1433,1434],{},"rng.next() \u002F 2³²"," may produce slightly different values in JavaScript vs. Python due to double precision. For cross-language reproducibility, work with integer outputs only.",[1406,1437,1438,1441],{},[24,1439,1440],{},"State serialization",": Long-running simulations may need to checkpoint. Serialize the full PRNG state array so you can resume from the exact point of interruption.",[29,1443,1445],{"className":31,"code":1444,"language":33,"meta":34,"style":34},"\u002F\u002F Checkpoint and restore\nconst checkpoint = [...rng.state]\n\u002F\u002F ... later ...\nconst restored = new Xoshiro256SS(0)\nrestored.state = checkpoint\n",[36,1446,1447,1452,1469,1474,1493],{"__ignoreMap":34},[39,1448,1449],{"class":41,"line":42},[39,1450,1451],{"class":45},"\u002F\u002F Checkpoint and restore\n",[39,1453,1454,1456,1459,1461,1463,1466],{"class":41,"line":49},[39,1455,1074],{"class":67},[39,1457,1458],{"class":80}," checkpoint",[39,1460,84],{"class":67},[39,1462,111],{"class":56},[39,1464,1465],{"class":67},"...",[39,1467,1468],{"class":56},"rng.state]\n",[39,1470,1471],{"class":41,"line":74},[39,1472,1473],{"class":45},"\u002F\u002F ... later ...\n",[39,1475,1476,1478,1481,1483,1485,1487,1489,1491],{"class":41,"line":101},[39,1477,1074],{"class":67},[39,1479,1480],{"class":80}," restored",[39,1482,84],{"class":67},[39,1484,87],{"class":67},[39,1486,490],{"class":52},[39,1488,57],{"class":56},[39,1490,526],{"class":80},[39,1492,98],{"class":56},[39,1494,1495,1498,1500],{"class":41,"line":141},[39,1496,1497],{"class":56},"restored.state ",[39,1499,521],{"class":67},[39,1501,1502],{"class":56}," checkpoint\n",[10,1504,1505,1506,1510],{},"Practice seeded random number generation with the tool at ",[1507,1508,1509],"a",{"href":1509},"\u002Ftools\u002Frandom-number",", which supports both standard and seeded modes with selectable algorithms and exportable seed values.",[1512,1513,1514],"style",{},"html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}",{"title":34,"searchDepth":49,"depth":49,"links":1516},[1517,1518,1519,1520],{"id":16,"depth":49,"text":17},{"id":342,"depth":49,"text":343},{"id":1107,"depth":49,"text":1108},{"id":1400,"depth":49,"text":1401},"2026-05-28","Use seeded PRNGs for reproducible random outputs in testing, simulations, and game dev.","md",{},"\u002Fguides\u002Frandom-seed-reproducibility",{"title":5,"description":1522},"guides\u002Frandom-seed-reproducibility","S0RvDZL1ZsyDumi5dP2t5hgGO6DN2l4E5yqY0rtl3rs",1780401336431]