github.com/twelsh-aw/go/src@v0.0.0-20230516233729-a56fe86a7c81/math/rand/regress_test.go (about) 1 // Copyright 2014 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 // Test that random number sequences generated by a specific seed 6 // do not change from version to version. 7 // 8 // Do NOT make changes to the golden outputs. If bugs need to be fixed 9 // in the underlying code, find ways to fix them that do not affect the 10 // outputs. 11 12 package rand_test 13 14 import ( 15 "flag" 16 "fmt" 17 . "math/rand" 18 "reflect" 19 "testing" 20 ) 21 22 var printgolden = flag.Bool("printgolden", false, "print golden results for regression test") 23 24 func TestRegress(t *testing.T) { 25 var int32s = []int32{1, 10, 32, 1 << 20, 1<<20 + 1, 1000000000, 1 << 30, 1<<31 - 2, 1<<31 - 1} 26 var int64s = []int64{1, 10, 32, 1 << 20, 1<<20 + 1, 1000000000, 1 << 30, 1<<31 - 2, 1<<31 - 1, 1000000000000000000, 1 << 60, 1<<63 - 2, 1<<63 - 1} 27 var permSizes = []int{0, 1, 5, 8, 9, 10, 16} 28 var readBufferSizes = []int{1, 7, 8, 9, 10} 29 r := New(NewSource(0)) 30 31 rv := reflect.ValueOf(r) 32 n := rv.NumMethod() 33 p := 0 34 if *printgolden { 35 fmt.Printf("var regressGolden = []interface{}{\n") 36 } 37 for i := 0; i < n; i++ { 38 m := rv.Type().Method(i) 39 mv := rv.Method(i) 40 mt := mv.Type() 41 if mt.NumOut() == 0 { 42 continue 43 } 44 r.Seed(0) 45 for repeat := 0; repeat < 20; repeat++ { 46 var args []reflect.Value 47 var argstr string 48 if mt.NumIn() == 1 { 49 var x any 50 switch mt.In(0).Kind() { 51 default: 52 t.Fatalf("unexpected argument type for r.%s", m.Name) 53 54 case reflect.Int: 55 if m.Name == "Perm" { 56 x = permSizes[repeat%len(permSizes)] 57 break 58 } 59 big := int64s[repeat%len(int64s)] 60 if int64(int(big)) != big { 61 r.Int63n(big) // what would happen on 64-bit machine, to keep stream in sync 62 if *printgolden { 63 fmt.Printf("\tskipped, // must run printgolden on 64-bit machine\n") 64 } 65 p++ 66 continue 67 } 68 x = int(big) 69 70 case reflect.Int32: 71 x = int32s[repeat%len(int32s)] 72 73 case reflect.Int64: 74 x = int64s[repeat%len(int64s)] 75 76 case reflect.Slice: 77 if m.Name == "Read" { 78 n := readBufferSizes[repeat%len(readBufferSizes)] 79 x = make([]byte, n) 80 } 81 } 82 argstr = fmt.Sprint(x) 83 args = append(args, reflect.ValueOf(x)) 84 } 85 86 var out any 87 out = mv.Call(args)[0].Interface() 88 if m.Name == "Int" || m.Name == "Intn" { 89 out = int64(out.(int)) 90 } 91 if m.Name == "Read" { 92 out = args[0].Interface().([]byte) 93 } 94 if *printgolden { 95 var val string 96 big := int64(1 << 60) 97 if int64(int(big)) != big && (m.Name == "Int" || m.Name == "Intn") { 98 // 32-bit machine cannot print 64-bit results 99 val = "truncated" 100 } else if reflect.TypeOf(out).Kind() == reflect.Slice { 101 val = fmt.Sprintf("%#v", out) 102 } else { 103 val = fmt.Sprintf("%T(%v)", out, out) 104 } 105 fmt.Printf("\t%s, // %s(%s)\n", val, m.Name, argstr) 106 } else { 107 want := regressGolden[p] 108 if m.Name == "Int" { 109 want = int64(int(uint(want.(int64)) << 1 >> 1)) 110 } 111 if !reflect.DeepEqual(out, want) { 112 t.Errorf("r.%s(%s) = %v, want %v", m.Name, argstr, out, want) 113 } 114 } 115 p++ 116 } 117 } 118 if *printgolden { 119 fmt.Printf("}\n") 120 } 121 } 122 123 var regressGolden = []any{ 124 float64(4.668112973579268), // ExpFloat64() 125 float64(0.1601593871172866), // ExpFloat64() 126 float64(3.0465834105636), // ExpFloat64() 127 float64(0.06385839451671879), // ExpFloat64() 128 float64(1.8578917487258961), // ExpFloat64() 129 float64(0.784676123472182), // ExpFloat64() 130 float64(0.11225477361256932), // ExpFloat64() 131 float64(0.20173283329802255), // ExpFloat64() 132 float64(0.3468619496201105), // ExpFloat64() 133 float64(0.35601103454384536), // ExpFloat64() 134 float64(0.888376329507869), // ExpFloat64() 135 float64(1.4081362450365698), // ExpFloat64() 136 float64(1.0077753823151994), // ExpFloat64() 137 float64(0.23594100766227588), // ExpFloat64() 138 float64(2.777245612300007), // ExpFloat64() 139 float64(0.5202997830662377), // ExpFloat64() 140 float64(1.2842705247770294), // ExpFloat64() 141 float64(0.030307408362776206), // ExpFloat64() 142 float64(2.204156824853721), // ExpFloat64() 143 float64(2.09891923895058), // ExpFloat64() 144 float32(0.94519615), // Float32() 145 float32(0.24496509), // Float32() 146 float32(0.65595627), // Float32() 147 float32(0.05434384), // Float32() 148 float32(0.3675872), // Float32() 149 float32(0.28948045), // Float32() 150 float32(0.1924386), // Float32() 151 float32(0.65533215), // Float32() 152 float32(0.8971697), // Float32() 153 float32(0.16735445), // Float32() 154 float32(0.28858566), // Float32() 155 float32(0.9026048), // Float32() 156 float32(0.84978026), // Float32() 157 float32(0.2730468), // Float32() 158 float32(0.6090802), // Float32() 159 float32(0.253656), // Float32() 160 float32(0.7746542), // Float32() 161 float32(0.017480763), // Float32() 162 float32(0.78707397), // Float32() 163 float32(0.7993937), // Float32() 164 float64(0.9451961492941164), // Float64() 165 float64(0.24496508529377975), // Float64() 166 float64(0.6559562651954052), // Float64() 167 float64(0.05434383959970039), // Float64() 168 float64(0.36758720663245853), // Float64() 169 float64(0.2894804331565928), // Float64() 170 float64(0.19243860967493215), // Float64() 171 float64(0.6553321508148324), // Float64() 172 float64(0.897169713149801), // Float64() 173 float64(0.16735444255905835), // Float64() 174 float64(0.2885856518054551), // Float64() 175 float64(0.9026048462705047), // Float64() 176 float64(0.8497802817628735), // Float64() 177 float64(0.2730468047134829), // Float64() 178 float64(0.6090801919903561), // Float64() 179 float64(0.25365600644283687), // Float64() 180 float64(0.7746542391859803), // Float64() 181 float64(0.017480762156647272), // Float64() 182 float64(0.7870739563039942), // Float64() 183 float64(0.7993936979594545), // Float64() 184 int64(8717895732742165505), // Int() 185 int64(2259404117704393152), // Int() 186 int64(6050128673802995827), // Int() 187 int64(501233450539197794), // Int() 188 int64(3390393562759376202), // Int() 189 int64(2669985732393126063), // Int() 190 int64(1774932891286980153), // Int() 191 int64(6044372234677422456), // Int() 192 int64(8274930044578894929), // Int() 193 int64(1543572285742637646), // Int() 194 int64(2661732831099943416), // Int() 195 int64(8325060299420976708), // Int() 196 int64(7837839688282259259), // Int() 197 int64(2518412263346885298), // Int() 198 int64(5617773211005988520), // Int() 199 int64(2339563716805116249), // Int() 200 int64(7144924247938981575), // Int() 201 int64(161231572858529631), // Int() 202 int64(7259475919510918339), // Int() 203 int64(7373105480197164748), // Int() 204 int32(2029793274), // Int31() 205 int32(526058514), // Int31() 206 int32(1408655353), // Int31() 207 int32(116702506), // Int31() 208 int32(789387515), // Int31() 209 int32(621654496), // Int31() 210 int32(413258767), // Int31() 211 int32(1407315077), // Int31() 212 int32(1926657288), // Int31() 213 int32(359390928), // Int31() 214 int32(619732968), // Int31() 215 int32(1938329147), // Int31() 216 int32(1824889259), // Int31() 217 int32(586363548), // Int31() 218 int32(1307989752), // Int31() 219 int32(544722126), // Int31() 220 int32(1663557311), // Int31() 221 int32(37539650), // Int31() 222 int32(1690228450), // Int31() 223 int32(1716684894), // Int31() 224 int32(0), // Int31n(1) 225 int32(4), // Int31n(10) 226 int32(25), // Int31n(32) 227 int32(310570), // Int31n(1048576) 228 int32(857611), // Int31n(1048577) 229 int32(621654496), // Int31n(1000000000) 230 int32(413258767), // Int31n(1073741824) 231 int32(1407315077), // Int31n(2147483646) 232 int32(1926657288), // Int31n(2147483647) 233 int32(0), // Int31n(1) 234 int32(8), // Int31n(10) 235 int32(27), // Int31n(32) 236 int32(367019), // Int31n(1048576) 237 int32(209005), // Int31n(1048577) 238 int32(307989752), // Int31n(1000000000) 239 int32(544722126), // Int31n(1073741824) 240 int32(1663557311), // Int31n(2147483646) 241 int32(37539650), // Int31n(2147483647) 242 int32(0), // Int31n(1) 243 int32(4), // Int31n(10) 244 int64(8717895732742165505), // Int63() 245 int64(2259404117704393152), // Int63() 246 int64(6050128673802995827), // Int63() 247 int64(501233450539197794), // Int63() 248 int64(3390393562759376202), // Int63() 249 int64(2669985732393126063), // Int63() 250 int64(1774932891286980153), // Int63() 251 int64(6044372234677422456), // Int63() 252 int64(8274930044578894929), // Int63() 253 int64(1543572285742637646), // Int63() 254 int64(2661732831099943416), // Int63() 255 int64(8325060299420976708), // Int63() 256 int64(7837839688282259259), // Int63() 257 int64(2518412263346885298), // Int63() 258 int64(5617773211005988520), // Int63() 259 int64(2339563716805116249), // Int63() 260 int64(7144924247938981575), // Int63() 261 int64(161231572858529631), // Int63() 262 int64(7259475919510918339), // Int63() 263 int64(7373105480197164748), // Int63() 264 int64(0), // Int63n(1) 265 int64(2), // Int63n(10) 266 int64(19), // Int63n(32) 267 int64(959842), // Int63n(1048576) 268 int64(688912), // Int63n(1048577) 269 int64(393126063), // Int63n(1000000000) 270 int64(89212473), // Int63n(1073741824) 271 int64(834026388), // Int63n(2147483646) 272 int64(1577188963), // Int63n(2147483647) 273 int64(543572285742637646), // Int63n(1000000000000000000) 274 int64(355889821886249464), // Int63n(1152921504606846976) 275 int64(8325060299420976708), // Int63n(9223372036854775806) 276 int64(7837839688282259259), // Int63n(9223372036854775807) 277 int64(0), // Int63n(1) 278 int64(0), // Int63n(10) 279 int64(25), // Int63n(32) 280 int64(679623), // Int63n(1048576) 281 int64(882178), // Int63n(1048577) 282 int64(510918339), // Int63n(1000000000) 283 int64(782454476), // Int63n(1073741824) 284 int64(0), // Intn(1) 285 int64(4), // Intn(10) 286 int64(25), // Intn(32) 287 int64(310570), // Intn(1048576) 288 int64(857611), // Intn(1048577) 289 int64(621654496), // Intn(1000000000) 290 int64(413258767), // Intn(1073741824) 291 int64(1407315077), // Intn(2147483646) 292 int64(1926657288), // Intn(2147483647) 293 int64(543572285742637646), // Intn(1000000000000000000) 294 int64(355889821886249464), // Intn(1152921504606846976) 295 int64(8325060299420976708), // Intn(9223372036854775806) 296 int64(7837839688282259259), // Intn(9223372036854775807) 297 int64(0), // Intn(1) 298 int64(2), // Intn(10) 299 int64(14), // Intn(32) 300 int64(515775), // Intn(1048576) 301 int64(839455), // Intn(1048577) 302 int64(690228450), // Intn(1000000000) 303 int64(642943070), // Intn(1073741824) 304 float64(-0.28158587086436215), // NormFloat64() 305 float64(0.570933095808067), // NormFloat64() 306 float64(-1.6920196326157044), // NormFloat64() 307 float64(0.1996229111693099), // NormFloat64() 308 float64(1.9195199291234621), // NormFloat64() 309 float64(0.8954838794918353), // NormFloat64() 310 float64(0.41457072128813166), // NormFloat64() 311 float64(-0.48700161491544713), // NormFloat64() 312 float64(-0.1684059662402393), // NormFloat64() 313 float64(0.37056410998929545), // NormFloat64() 314 float64(1.0156889027029008), // NormFloat64() 315 float64(-0.5174422210625114), // NormFloat64() 316 float64(-0.5565834214413804), // NormFloat64() 317 float64(0.778320596648391), // NormFloat64() 318 float64(-1.8970718197702225), // NormFloat64() 319 float64(0.5229525761688676), // NormFloat64() 320 float64(-1.5515595563231523), // NormFloat64() 321 float64(0.0182029289376123), // NormFloat64() 322 float64(-0.6820951356608795), // NormFloat64() 323 float64(-0.5987943422687668), // NormFloat64() 324 []int{}, // Perm(0) 325 []int{0}, // Perm(1) 326 []int{0, 4, 1, 3, 2}, // Perm(5) 327 []int{3, 1, 0, 4, 7, 5, 2, 6}, // Perm(8) 328 []int{5, 0, 3, 6, 7, 4, 2, 1, 8}, // Perm(9) 329 []int{4, 5, 0, 2, 6, 9, 3, 1, 8, 7}, // Perm(10) 330 []int{14, 2, 0, 8, 3, 5, 13, 12, 1, 4, 6, 7, 11, 9, 15, 10}, // Perm(16) 331 []int{}, // Perm(0) 332 []int{0}, // Perm(1) 333 []int{3, 0, 1, 2, 4}, // Perm(5) 334 []int{5, 1, 2, 0, 4, 7, 3, 6}, // Perm(8) 335 []int{4, 0, 6, 8, 1, 5, 2, 7, 3}, // Perm(9) 336 []int{8, 6, 1, 7, 5, 4, 3, 2, 9, 0}, // Perm(10) 337 []int{0, 3, 13, 2, 15, 4, 10, 1, 8, 14, 7, 6, 12, 9, 5, 11}, // Perm(16) 338 []int{}, // Perm(0) 339 []int{0}, // Perm(1) 340 []int{0, 4, 2, 1, 3}, // Perm(5) 341 []int{2, 1, 7, 0, 6, 3, 4, 5}, // Perm(8) 342 []int{8, 7, 5, 3, 4, 6, 0, 1, 2}, // Perm(9) 343 []int{1, 0, 2, 5, 7, 6, 9, 8, 3, 4}, // Perm(10) 344 []byte{0x1}, // Read([0]) 345 []byte{0x94, 0xfd, 0xc2, 0xfa, 0x2f, 0xfc, 0xc0}, // Read([0 0 0 0 0 0 0]) 346 []byte{0x41, 0xd3, 0xff, 0x12, 0x4, 0x5b, 0x73, 0xc8}, // Read([0 0 0 0 0 0 0 0]) 347 []byte{0x6e, 0x4f, 0xf9, 0x5f, 0xf6, 0x62, 0xa5, 0xee, 0xe8}, // Read([0 0 0 0 0 0 0 0 0]) 348 []byte{0x2a, 0xbd, 0xf4, 0x4a, 0x2d, 0xb, 0x75, 0xfb, 0x18, 0xd}, // Read([0 0 0 0 0 0 0 0 0 0]) 349 []byte{0xaf}, // Read([0]) 350 []byte{0x48, 0xa7, 0x9e, 0xe0, 0xb1, 0xd, 0x39}, // Read([0 0 0 0 0 0 0]) 351 []byte{0x46, 0x51, 0x85, 0xf, 0xd4, 0xa1, 0x78, 0x89}, // Read([0 0 0 0 0 0 0 0]) 352 []byte{0x2e, 0xe2, 0x85, 0xec, 0xe1, 0x51, 0x14, 0x55, 0x78}, // Read([0 0 0 0 0 0 0 0 0]) 353 []byte{0x8, 0x75, 0xd6, 0x4e, 0xe2, 0xd3, 0xd0, 0xd0, 0xde, 0x6b}, // Read([0 0 0 0 0 0 0 0 0 0]) 354 []byte{0xf8}, // Read([0]) 355 []byte{0xf9, 0xb4, 0x4c, 0xe8, 0x5f, 0xf0, 0x44}, // Read([0 0 0 0 0 0 0]) 356 []byte{0xc6, 0xb1, 0xf8, 0x3b, 0x8e, 0x88, 0x3b, 0xbf}, // Read([0 0 0 0 0 0 0 0]) 357 []byte{0x85, 0x7a, 0xab, 0x99, 0xc5, 0xb2, 0x52, 0xc7, 0x42}, // Read([0 0 0 0 0 0 0 0 0]) 358 []byte{0x9c, 0x32, 0xf3, 0xa8, 0xae, 0xb7, 0x9e, 0xf8, 0x56, 0xf6}, // Read([0 0 0 0 0 0 0 0 0 0]) 359 []byte{0x59}, // Read([0]) 360 []byte{0xc1, 0x8f, 0xd, 0xce, 0xcc, 0x77, 0xc7}, // Read([0 0 0 0 0 0 0]) 361 []byte{0x5e, 0x7a, 0x81, 0xbf, 0xde, 0x27, 0x5f, 0x67}, // Read([0 0 0 0 0 0 0 0]) 362 []byte{0xcf, 0xe2, 0x42, 0xcf, 0x3c, 0xc3, 0x54, 0xf3, 0xed}, // Read([0 0 0 0 0 0 0 0 0]) 363 []byte{0xe2, 0xd6, 0xbe, 0xcc, 0x4e, 0xa3, 0xae, 0x5e, 0x88, 0x52}, // Read([0 0 0 0 0 0 0 0 0 0]) 364 uint32(4059586549), // Uint32() 365 uint32(1052117029), // Uint32() 366 uint32(2817310706), // Uint32() 367 uint32(233405013), // Uint32() 368 uint32(1578775030), // Uint32() 369 uint32(1243308993), // Uint32() 370 uint32(826517535), // Uint32() 371 uint32(2814630155), // Uint32() 372 uint32(3853314576), // Uint32() 373 uint32(718781857), // Uint32() 374 uint32(1239465936), // Uint32() 375 uint32(3876658295), // Uint32() 376 uint32(3649778518), // Uint32() 377 uint32(1172727096), // Uint32() 378 uint32(2615979505), // Uint32() 379 uint32(1089444252), // Uint32() 380 uint32(3327114623), // Uint32() 381 uint32(75079301), // Uint32() 382 uint32(3380456901), // Uint32() 383 uint32(3433369789), // Uint32() 384 uint64(8717895732742165505), // Uint64() 385 uint64(2259404117704393152), // Uint64() 386 uint64(6050128673802995827), // Uint64() 387 uint64(9724605487393973602), // Uint64() 388 uint64(12613765599614152010), // Uint64() 389 uint64(11893357769247901871), // Uint64() 390 uint64(1774932891286980153), // Uint64() 391 uint64(15267744271532198264), // Uint64() 392 uint64(17498302081433670737), // Uint64() 393 uint64(1543572285742637646), // Uint64() 394 uint64(11885104867954719224), // Uint64() 395 uint64(17548432336275752516), // Uint64() 396 uint64(7837839688282259259), // Uint64() 397 uint64(2518412263346885298), // Uint64() 398 uint64(5617773211005988520), // Uint64() 399 uint64(11562935753659892057), // Uint64() 400 uint64(16368296284793757383), // Uint64() 401 uint64(161231572858529631), // Uint64() 402 uint64(16482847956365694147), // Uint64() 403 uint64(16596477517051940556), // Uint64() 404 }