Home | History | Annotate | Download | only in rand
      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 interface{}
     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 interface{}
     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 = []interface{}{
    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 }
    405