gonum.org/v1/gonum@v0.14.0/mathext/prng/prng_di_unimi_test.go (about) 1 // Copyright ©2019 The Gonum 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 prng 6 7 import ( 8 "testing" 9 "time" 10 11 "golang.org/x/exp/rand" 12 ) 13 14 // Random values in tests are produced by 40 iterations of the C code. 15 16 var _ rand.Source = (*SplitMix64)(nil) 17 18 func TestSplitMix64(t *testing.T) { 19 t.Parallel() 20 want := []uint64{ 21 10451216379200822465, 13757245211066428519, 17911839290282890590, 8196980753821780235, 8195237237126968761, 22 14072917602864530048, 16184226688143867045, 9648886400068060533, 5266705631892356520, 14646652180046636950, 23 7455107161863376737, 11168034603498703870, 8392123148533390784, 9778231605760336522, 8042142155559163816, 24 3081251696030599739, 11904322950028659555, 15040563541741120241, 12575237177726700014, 16312908901713405192, 25 1216750802008901446, 1501835286251455644, 9147370558249537485, 2270958130545493676, 5292580334274787743, 26 883620860755687159, 9509663594007654709, 13166747327335888811, 807013244984872231, 18405200023706498954, 27 11028426030083068036, 10820770463232788922, 7326479631639850093, 8097875853865443356, 4672064935750269975, 28 9772298966463872780, 10028955912863736053, 13802505617680978881, 15090054588401425688, 12333003614474408764, 29 } 30 31 sm := NewSplitMix64(1) 32 for i := range want { 33 got := sm.Uint64() 34 if got != want[i] { 35 t.Errorf("unexpected random value at iteration %d: got:%d want:%d", i, got, want[i]) 36 } 37 } 38 } 39 40 func TestSplitMix64RoundTrip(t *testing.T) { 41 t.Parallel() 42 var src SplitMix64 43 src.Seed(uint64(time.Now().Unix())) 44 45 buf, err := src.MarshalBinary() 46 if err != nil { 47 t.Errorf("unexpected error marshaling state: %v", err) 48 } 49 50 var dst SplitMix64 51 // Get dst into a non-zero state. 52 dst.Seed(1) 53 for i := 0; i < 10; i++ { 54 dst.Uint64() 55 } 56 57 err = dst.UnmarshalBinary(buf) 58 if err != nil { 59 t.Errorf("unexpected error unmarshaling state: %v", err) 60 } 61 62 if dst != src { 63 t.Errorf("mismatch between generator states: got:%+v want:%+v", dst, src) 64 } 65 } 66 67 var _ rand.Source = (*Xoshiro256plus)(nil) 68 69 func TestXoshiro256plus(t *testing.T) { 70 t.Parallel() 71 want := []uint64{ 72 201453059313051084, 16342930563397888806, 2922809869868169223, 13315230553875954649, 6410977891529050008, 73 2721661332018190285, 3769995280709464022, 17208995829377771030, 16938999919058283733, 8307416726322109393, 74 13997290115667311691, 5498422487743993519, 13193129985428835789, 17178224140053183722, 3371202013665523682, 75 6673444001875245482, 11649545741795472859, 4657392542380076879, 8631341306563158492, 16151880809814987639, 76 15271080878658922261, 6998002807989632655, 11431762507643441726, 136605885039865329, 16072241235209520170, 77 17064623797431990278, 6319393334343723778, 3599071131527455911, 14678971584471326753, 11566847267978507055, 78 37242444495476935, 9767625399998905638, 14799351402198708144, 15147234459691564338, 10081976988475685812, 79 12402022881820243150, 17939631254687971868, 15680836376982110901, 179319489669050051, 16194215847106809765, 80 } 81 82 xsr := NewXoshiro256plus(1) 83 for i := range want { 84 got := xsr.Uint64() 85 if got != want[i] { 86 t.Errorf("unexpected random value at iteration %d: got:%d want:%d", i, got, want[i]) 87 } 88 } 89 } 90 91 func TestXoshiro256plusRoundTrip(t *testing.T) { 92 t.Parallel() 93 var src Xoshiro256plus 94 src.Seed(uint64(time.Now().Unix())) 95 96 src.Uint64() // Step PRNG once to makes sure states are mixed. 97 98 buf, err := src.MarshalBinary() 99 if err != nil { 100 t.Errorf("unexpected error marshaling state: %v", err) 101 } 102 103 var dst Xoshiro256plus 104 // Get dst into a non-zero state. 105 dst.Seed(1) 106 for i := 0; i < 10; i++ { 107 dst.Uint64() 108 } 109 110 err = dst.UnmarshalBinary(buf) 111 if err != nil { 112 t.Errorf("unexpected error unmarshaling state: %v", err) 113 } 114 115 if dst != src { 116 t.Errorf("mismatch between generator states: got:%+v want:%+v", dst, src) 117 } 118 } 119 120 var _ rand.Source = (*Xoshiro256plusplus)(nil) 121 122 func TestXoshiro256plusplus(t *testing.T) { 123 t.Parallel() 124 want := []uint64{ 125 14971601782005023387, 13781649495232077965, 1847458086238483744, 13765271635752736470, 3406718355780431780, 126 10892412867582108485, 18204613561675945223, 9655336933892813345, 1781989159761824720, 2477283028068920342, 127 16978024111547606601, 6336475467619303347, 1336129645694042326, 7278725533440954441, 1650926874576718010, 128 2884092293074692283, 10277292511068429730, 8723528388573605619, 17670016435951889822, 11847526622624223050, 129 4869519043768407819, 14645621260580619786, 2927941368235978475, 7627105703721172900, 4384663367605854827, 130 11119034730948704880, 3397900810577180010, 18115970067406137490, 11274606161466886392, 13467911786374401590, 131 10949103424463861935, 11981483663808188895, 9358210361682609782, 11442939244776437245, 17602980262171424054, 132 5959474180322755185, 1996769245947054333, 13544632058761996522, 16649296193330087156, 12760326241867116135, 133 } 134 135 xsr := NewXoshiro256plusplus(1) 136 for i := range want { 137 got := xsr.Uint64() 138 if got != want[i] { 139 t.Errorf("unexpected random value at iteration %d: got:%d want:%d", i, got, want[i]) 140 } 141 } 142 } 143 144 func TestXoshiro256plusplusRoundTrip(t *testing.T) { 145 t.Parallel() 146 var src Xoshiro256plusplus 147 src.Seed(uint64(time.Now().Unix())) 148 149 src.Uint64() // Step PRNG once to makes sure states are mixed. 150 151 buf, err := src.MarshalBinary() 152 if err != nil { 153 t.Errorf("unexpected error marshaling state: %v", err) 154 } 155 156 var dst Xoshiro256plusplus 157 // Get dst into a non-zero state. 158 dst.Seed(1) 159 for i := 0; i < 10; i++ { 160 dst.Uint64() 161 } 162 163 err = dst.UnmarshalBinary(buf) 164 if err != nil { 165 t.Errorf("unexpected error unmarshaling state: %v", err) 166 } 167 168 if dst != src { 169 t.Errorf("mismatch between generator states: got:%+v want:%+v", dst, src) 170 } 171 } 172 173 var _ rand.Source = (*Xoshiro256starstar)(nil) 174 175 func TestXoshiro256starstar(t *testing.T) { 176 t.Parallel() 177 want := []uint64{ 178 12966619160104079557, 9600361134598540522, 10590380919521690900, 7218738570589545383, 12860671823995680371, 179 2648436617965840162, 1310552918490157286, 7031611932980406429, 15996139959407692321, 10177250653276320208, 180 17202925169076741841, 17657558547222227110, 17206619296382044401, 12342657103067243573, 11066818095355039191, 181 16427605434558419749, 1484150211974036615, 9063990983673329711, 845232928428614080, 1176429380546917807, 182 8545088851120551825, 9158324580728115577, 11267126437916202177, 6452051665337041730, 7460617819096774474, 183 3909615622106851260, 7148019177890935463, 15761474764570999248, 13856144421012645925, 18119237044791779759, 184 202581184499657049, 16256128138147959276, 7894450248801719761, 7285265299121834259, 11974578372788407364, 185 4350246478179107086, 4560570958642824732, 15448532239578831742, 7084622563335324071, 8654072644765974953, 186 } 187 188 xsr := NewXoshiro256starstar(1) 189 for i := range want { 190 got := xsr.Uint64() 191 if got != want[i] { 192 t.Errorf("unexpected random value at iteration %d: got:%d want:%d", i, got, want[i]) 193 } 194 } 195 } 196 197 func TestXoshiro256starstarRoundTrip(t *testing.T) { 198 t.Parallel() 199 var src Xoshiro256starstar 200 src.Seed(uint64(time.Now().Unix())) 201 202 src.Uint64() // Step PRNG once to makes sure states are mixed. 203 204 buf, err := src.MarshalBinary() 205 if err != nil { 206 t.Errorf("unexpected error marshaling state: %v", err) 207 } 208 209 var dst Xoshiro256starstar 210 // Get dst into a non-zero state. 211 dst.Seed(1) 212 for i := 0; i < 10; i++ { 213 dst.Uint64() 214 } 215 216 err = dst.UnmarshalBinary(buf) 217 if err != nil { 218 t.Errorf("unexpected error unmarshaling state: %v", err) 219 } 220 221 if dst != src { 222 t.Errorf("mismatch between generator states: got:%+v want:%+v", dst, src) 223 } 224 }