...

Source file src/math/rand/regress_test.go

Documentation: math/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  

View as plain text