| // Copyright 2014 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| // Test that random number sequences generated by a specific seed |
| // do not change from version to version. |
| // |
| // If the generator changes, the golden outputs need updating, and |
| // client programs may break. Although the desire for compatibility |
| // is not as stringent as in the original math/rand package, |
| // when possible avoid changing the generator. |
| |
| package rand_test |
| |
| import ( |
| "flag" |
| "fmt" |
| "reflect" |
| "testing" |
| |
| . "golang.org/x/exp/rand" |
| ) |
| |
| var printgolden = flag.Bool("printgolden", false, "print golden results for regression test") |
| |
| // TestSource verifies that the output of the default Source is locked down. |
| func TestSourceRegress(t *testing.T) { |
| src := NewSource(1) |
| var got [20]uint64 |
| for i := range got { |
| got[i] = src.Uint64() |
| } |
| want := [20]uint64{ |
| 0x34e936394905d167, |
| 0x817c0ef62fe4c731, |
| 0x937987e6e24f5a40, |
| 0x0c0a8307fe226199, |
| 0xf96363568d8bab56, |
| 0xbaef3af36bd02620, |
| 0x8f18e416eb6b936b, |
| 0x05a43fc149f3a67a, |
| 0xdab012eb3ce01697, |
| 0xf76c495a133c6aa9, |
| 0x304b24c5040ce457, |
| 0x47d77e0abb413159, |
| 0x52a810fa9e452f04, |
| 0x2d24b66380cf4780, |
| 0x5ec7691b92018ef5, |
| 0x5076dfa749261ea0, |
| 0xac8f11ad3941d213, |
| 0x13fa8d67de91db25, |
| 0xb50883a9893274eb, |
| 0xeb8f59263f9109ac, |
| } |
| if got != want { |
| t.Errorf("got:\n\t%#016x\nwant:\n\t%#016x", got, want) |
| if *printgolden { |
| for _, x := range got { |
| fmt.Printf("\t\t%#016x,\n", x) |
| } |
| } |
| } |
| } |
| |
| // TestRegress validates that the output stream is locked down, for instance so |
| // optimizations do not change the output. It iterates over methods of the |
| // Rand type to find functions to evaluate and checks the first 20 results |
| // against the golden results. |
| func TestRegress(t *testing.T) { |
| var int32s = []int32{1, 10, 32, 1 << 20, 1<<20 + 1, 1000000000, 1 << 30, 1<<31 - 2, 1<<31 - 1} |
| 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} |
| var uint64s = []uint64{1, 10, 32, 1 << 20, 1<<20 + 1, 1000000000, 1 << 30, 1<<31 - 2, 1<<31 - 1, 1000000000000000000, 1 << 60, 1<<64 - 2, 1<<64 - 1} |
| var permSizes = []int{0, 1, 5, 8, 9, 10, 16} |
| var readBufferSizes = []int{1, 7, 8, 9, 10} |
| r := New(NewSource(0)) |
| |
| rv := reflect.ValueOf(r) |
| n := rv.NumMethod() |
| p := 0 |
| if *printgolden { |
| fmt.Printf("var regressGolden = []interface{}{\n") |
| } |
| for i := 0; i < n; i++ { |
| m := rv.Type().Method(i) |
| mv := rv.Method(i) |
| mt := mv.Type() |
| if mt.NumOut() == 0 { |
| continue |
| } |
| r.Seed(0) |
| if *printgolden && i > 0 { |
| fmt.Println() |
| } |
| for repeat := 0; repeat < 20; repeat++ { |
| var args []reflect.Value |
| var argstr string |
| if mt.NumIn() == 1 { |
| var x interface{} |
| switch mt.In(0).Kind() { |
| default: |
| t.Fatalf("unexpected argument type for r.%s", m.Name) |
| |
| case reflect.Int: |
| if m.Name == "Perm" { |
| x = permSizes[repeat%len(permSizes)] |
| break |
| } |
| big := int64s[repeat%len(int64s)] |
| if int64(int(big)) != big { |
| r.Int63n(big) // what would happen on 64-bit machine, to keep stream in sync |
| if *printgolden { |
| fmt.Printf("\tskipped, // must run printgolden on 64-bit machine\n") |
| } |
| p++ |
| continue |
| } |
| x = int(big) |
| |
| case reflect.Int32: |
| x = int32s[repeat%len(int32s)] |
| |
| case reflect.Int64: |
| x = int64s[repeat%len(int64s)] |
| |
| case reflect.Uint64: |
| x = uint64s[repeat%len(uint64s)] |
| |
| case reflect.Slice: |
| if m.Name == "Read" { |
| n := readBufferSizes[repeat%len(readBufferSizes)] |
| x = make([]byte, n) |
| } |
| } |
| argstr = fmt.Sprint(x) |
| args = append(args, reflect.ValueOf(x)) |
| } |
| |
| var out interface{} |
| out = mv.Call(args)[0].Interface() |
| if m.Name == "Int" || m.Name == "Intn" { |
| out = int64(out.(int)) |
| } |
| if m.Name == "Read" { |
| out = args[0].Interface().([]byte) |
| } |
| if *printgolden { |
| var val string |
| big := int64(1 << 60) |
| if int64(int(big)) != big && (m.Name == "Int" || m.Name == "Intn") { |
| // 32-bit machine cannot print 64-bit results |
| val = "truncated" |
| } else if reflect.TypeOf(out).Kind() == reflect.Slice { |
| val = fmt.Sprintf("%#v", out) |
| } else { |
| val = fmt.Sprintf("%T(%v)", out, out) |
| } |
| fmt.Printf("\t%s, // %s(%s)\n", val, m.Name, argstr) |
| } else { |
| want := regressGolden[p] |
| if m.Name == "Int" { |
| want = int64(int(uint(want.(int64)) << 1 >> 1)) |
| } |
| if !reflect.DeepEqual(out, want) { |
| t.Errorf("r.%s(%s) = %v, want %v", m.Name, argstr, out, want) |
| } |
| } |
| p++ |
| } |
| } |
| if *printgolden { |
| fmt.Printf("}\n") |
| } |
| } |
| |
| var regressGolden = []interface{}{ |
| float64(0.6279600685109523), // ExpFloat64() |
| float64(0.16198826513357806), // ExpFloat64() |
| float64(0.007880404652650552), // ExpFloat64() |
| float64(0.41649788761745654), // ExpFloat64() |
| float64(1.6958707787276301), // ExpFloat64() |
| float64(2.7227327706138036), // ExpFloat64() |
| float64(2.4235600263079657), // ExpFloat64() |
| float64(1.277967771105418), // ExpFloat64() |
| float64(0.7111660437031769), // ExpFloat64() |
| float64(0.23090401427981888), // ExpFloat64() |
| float64(1.4746763588379928), // ExpFloat64() |
| float64(1.4868726779832278), // ExpFloat64() |
| float64(0.1686257242078103), // ExpFloat64() |
| float64(0.2732721816228957), // ExpFloat64() |
| float64(0.4644536065869748), // ExpFloat64() |
| float64(0.01319850986379164), // ExpFloat64() |
| float64(0.7184492551742854), // ExpFloat64() |
| float64(0.1913536422195827), // ExpFloat64() |
| float64(0.16034475958495667), // ExpFloat64() |
| float64(0.40599859014785644), // ExpFloat64() |
| |
| float32(0.7979972), // Float32() |
| float32(0.7725961), // Float32() |
| float32(0.21894403), // Float32() |
| float32(0.96194494), // Float32() |
| float32(0.2915732), // Float32() |
| float32(0.59569645), // Float32() |
| float32(0.99596655), // Float32() |
| float32(0.4979039), // Float32() |
| float32(0.98148686), // Float32() |
| float32(0.01380035), // Float32() |
| float32(0.086487144), // Float32() |
| float32(0.6114401), // Float32() |
| float32(0.71081316), // Float32() |
| float32(0.6342346), // Float32() |
| float32(0.008082573), // Float32() |
| float32(0.33020085), // Float32() |
| float32(0.032625034), // Float32() |
| float32(0.9278005), // Float32() |
| float32(0.34497985), // Float32() |
| float32(0.66506875), // Float32() |
| |
| float64(0.797997151016231), // Float64() |
| float64(0.7725961454373316), // Float64() |
| float64(0.21894402538580782), // Float64() |
| float64(0.9619449481780457), // Float64() |
| float64(0.2915731877602916), // Float64() |
| float64(0.5956964580775652), // Float64() |
| float64(0.9959665347028619), // Float64() |
| float64(0.49790390966591147), // Float64() |
| float64(0.9814868602566785), // Float64() |
| float64(0.013800350332924483), // Float64() |
| float64(0.08648714463652596), // Float64() |
| float64(0.6114401479210267), // Float64() |
| float64(0.7108131531183706), // Float64() |
| float64(0.6342346133706837), // Float64() |
| float64(0.008082572853887138), // Float64() |
| float64(0.3302008651926287), // Float64() |
| float64(0.03262503454637655), // Float64() |
| float64(0.9278004634858956), // Float64() |
| float64(0.3449798628384906), // Float64() |
| float64(0.665068719316529), // Float64() |
| |
| int64(5474557666971700975), // Int() |
| int64(5591422465364813936), // Int() |
| int64(74029666500212977), // Int() |
| int64(8088122161323000979), // Int() |
| int64(7298457654139700474), // Int() |
| int64(1590632625527662686), // Int() |
| int64(9052198920789078554), // Int() |
| int64(7381380909356947872), // Int() |
| int64(1738222704626512495), // Int() |
| int64(3278744831230954970), // Int() |
| int64(7062423222661652521), // Int() |
| int64(6715870808026712034), // Int() |
| int64(528819992478005418), // Int() |
| int64(2284534088986354339), // Int() |
| int64(945828723091990082), // Int() |
| int64(3813019469742317492), // Int() |
| int64(1369388146907482806), // Int() |
| int64(7367238674766648970), // Int() |
| int64(8217673022687244206), // Int() |
| int64(3185531743396549562), // Int() |
| |
| int32(1711064216), // Int31() |
| int32(650927245), // Int31() |
| int32(8618187), // Int31() |
| int32(941581344), // Int31() |
| int32(1923394120), // Int31() |
| int32(1258915833), // Int31() |
| int32(1053814650), // Int31() |
| int32(859305834), // Int31() |
| int32(1276097579), // Int31() |
| int32(1455437958), // Int31() |
| int32(1895916096), // Int31() |
| int32(781830261), // Int31() |
| int32(61562749), // Int31() |
| int32(265954771), // Int31() |
| int32(1183850779), // Int31() |
| int32(443893888), // Int31() |
| int32(1233159585), // Int31() |
| int32(857659461), // Int31() |
| int32(956663049), // Int31() |
| int32(370844703), // Int31() |
| |
| int32(0), // Int31n(1) |
| int32(6), // Int31n(10) |
| int32(17), // Int31n(32) |
| int32(1000595), // Int31n(1048576) |
| int32(424333), // Int31n(1048577) |
| int32(382438494), // Int31n(1000000000) |
| int32(902738458), // Int31n(1073741824) |
| int32(1204933878), // Int31n(2147483646) |
| int32(1376191263), // Int31n(2147483647) |
| int32(0), // Int31n(1) |
| int32(9), // Int31n(10) |
| int32(2), // Int31n(32) |
| int32(440490), // Int31n(1048576) |
| int32(176312), // Int31n(1048577) |
| int32(946765890), // Int31n(1000000000) |
| int32(665034676), // Int31n(1073741824) |
| int32(1947285452), // Int31n(2147483646) |
| int32(1702344608), // Int31n(2147483647) |
| int32(0), // Int31n(1) |
| int32(2), // Int31n(10) |
| |
| int64(5474557666971700975), // Int63() |
| int64(5591422465364813936), // Int63() |
| int64(74029666500212977), // Int63() |
| int64(8088122161323000979), // Int63() |
| int64(7298457654139700474), // Int63() |
| int64(1590632625527662686), // Int63() |
| int64(9052198920789078554), // Int63() |
| int64(7381380909356947872), // Int63() |
| int64(1738222704626512495), // Int63() |
| int64(3278744831230954970), // Int63() |
| int64(7062423222661652521), // Int63() |
| int64(6715870808026712034), // Int63() |
| int64(528819992478005418), // Int63() |
| int64(2284534088986354339), // Int63() |
| int64(945828723091990082), // Int63() |
| int64(3813019469742317492), // Int63() |
| int64(1369388146907482806), // Int63() |
| int64(7367238674766648970), // Int63() |
| int64(8217673022687244206), // Int63() |
| int64(3185531743396549562), // Int63() |
| |
| int64(0), // Int63n(1) |
| int64(6), // Int63n(10) |
| int64(17), // Int63n(32) |
| int64(1000595), // Int63n(1048576) |
| int64(424333), // Int63n(1048577) |
| int64(382438494), // Int63n(1000000000) |
| int64(902738458), // Int63n(1073741824) |
| int64(1204933878), // Int63n(2147483646) |
| int64(1376191263), // Int63n(2147483647) |
| int64(502116868085730778), // Int63n(1000000000000000000) |
| int64(144894195020570665), // Int63n(1152921504606846976) |
| int64(6715870808026712034), // Int63n(9223372036854775806) |
| int64(528819992478005418), // Int63n(9223372036854775807) |
| int64(0), // Int63n(1) |
| int64(0), // Int63n(10) |
| int64(20), // Int63n(32) |
| int64(854710), // Int63n(1048576) |
| int64(649893), // Int63n(1048577) |
| int64(687244206), // Int63n(1000000000) |
| int64(836883386), // Int63n(1073741824) |
| |
| int64(0), // Intn(1) |
| int64(6), // Intn(10) |
| int64(17), // Intn(32) |
| int64(1000595), // Intn(1048576) |
| int64(424333), // Intn(1048577) |
| int64(382438494), // Intn(1000000000) |
| int64(902738458), // Intn(1073741824) |
| int64(1204933878), // Intn(2147483646) |
| int64(1376191263), // Intn(2147483647) |
| int64(502116868085730778), // Intn(1000000000000000000) |
| int64(144894195020570665), // Intn(1152921504606846976) |
| int64(6715870808026712034), // Intn(9223372036854775806) |
| int64(528819992478005418), // Intn(9223372036854775807) |
| int64(0), // Intn(1) |
| int64(0), // Intn(10) |
| int64(20), // Intn(32) |
| int64(854710), // Intn(1048576) |
| int64(649893), // Intn(1048577) |
| int64(687244206), // Intn(1000000000) |
| int64(836883386), // Intn(1073741824) |
| |
| float64(-0.5410658516792047), // NormFloat64() |
| float64(0.615296849055287), // NormFloat64() |
| float64(0.007477442280032887), // NormFloat64() |
| float64(1.3443892057169684), // NormFloat64() |
| float64(-0.17508902754863512), // NormFloat64() |
| float64(-2.03494397556937), // NormFloat64() |
| float64(2.5213558871972306), // NormFloat64() |
| float64(1.4572921639613627), // NormFloat64() |
| float64(-1.5164961164210644), // NormFloat64() |
| float64(-0.4861150771891445), // NormFloat64() |
| float64(-0.8699409548614199), // NormFloat64() |
| float64(1.6271559815452794), // NormFloat64() |
| float64(0.1659465769926195), // NormFloat64() |
| float64(0.2921716191987018), // NormFloat64() |
| float64(-1.2550269636927838), // NormFloat64() |
| float64(0.11257973349467548), // NormFloat64() |
| float64(0.5437525915836436), // NormFloat64() |
| float64(0.781754430770282), // NormFloat64() |
| float64(0.5201256313962235), // NormFloat64() |
| float64(1.3826174159276245), // NormFloat64() |
| |
| []int{}, // Perm(0) |
| []int{0}, // Perm(1) |
| []int{0, 2, 3, 1, 4}, // Perm(5) |
| []int{5, 6, 3, 7, 4, 2, 0, 1}, // Perm(8) |
| []int{8, 4, 5, 2, 7, 3, 0, 6, 1}, // Perm(9) |
| []int{6, 1, 5, 3, 2, 9, 7, 0, 8, 4}, // Perm(10) |
| []int{12, 5, 1, 9, 15, 7, 13, 6, 10, 11, 8, 0, 4, 2, 14, 3}, // Perm(16) |
| []int{}, // Perm(0) |
| []int{0}, // Perm(1) |
| []int{0, 2, 3, 4, 1}, // Perm(5) |
| []int{3, 2, 7, 4, 0, 6, 5, 1}, // Perm(8) |
| []int{0, 6, 2, 1, 3, 7, 5, 8, 4}, // Perm(9) |
| []int{2, 5, 6, 4, 7, 3, 0, 8, 1, 9}, // Perm(10) |
| []int{3, 6, 5, 4, 9, 15, 13, 7, 1, 11, 10, 8, 12, 0, 2, 14}, // Perm(16) |
| []int{}, // Perm(0) |
| []int{0}, // Perm(1) |
| []int{2, 4, 3, 1, 0}, // Perm(5) |
| []int{1, 6, 7, 5, 4, 3, 2, 0}, // Perm(8) |
| []int{7, 6, 8, 2, 0, 1, 3, 4, 5}, // Perm(9) |
| []int{2, 9, 7, 1, 5, 4, 0, 6, 8, 3}, // Perm(10) |
| |
| []byte{0xef}, // Read([0]) |
| []byte{0x4e, 0x3d, 0x52, 0x31, 0x89, 0xf9, 0xcb}, // Read([0 0 0 0 0 0 0]) |
| []byte{0x70, 0x68, 0x35, 0x8d, 0x1b, 0xb9, 0x98, 0x4d}, // Read([0 0 0 0 0 0 0 0]) |
| []byte{0xf1, 0xf8, 0x95, 0xe6, 0x96, 0x1, 0x7, 0x1, 0x93}, // Read([0 0 0 0 0 0 0 0 0]) |
| []byte{0x44, 0x9f, 0xc5, 0x40, 0xc8, 0x3e, 0x70, 0xfa, 0x44, 0x3a}, // Read([0 0 0 0 0 0 0 0 0 0]) |
| []byte{0x4b}, // Read([0]) |
| []byte{0x91, 0x54, 0x49, 0xe5, 0x5e, 0x28, 0xb9}, // Read([0 0 0 0 0 0 0]) |
| []byte{0x4, 0xf2, 0xf, 0x13, 0x96, 0x1a, 0xb2, 0xce}, // Read([0 0 0 0 0 0 0 0]) |
| []byte{0x35, 0xf5, 0xde, 0x9f, 0x7d, 0xa0, 0x19, 0x12, 0x2e}, // Read([0 0 0 0 0 0 0 0 0]) |
| []byte{0xd4, 0xee, 0x6f, 0x66, 0x6f, 0x32, 0xc8, 0x21, 0x57, 0x68}, // Read([0 0 0 0 0 0 0 0 0 0]) |
| []byte{0x1f}, // Read([0]) |
| []byte{0x98, 0xda, 0x4d, 0xab, 0x6e, 0xd, 0x71}, // Read([0 0 0 0 0 0 0]) |
| []byte{0x80, 0xad, 0x29, 0xa0, 0x37, 0xb0, 0x80, 0xc4}, // Read([0 0 0 0 0 0 0 0]) |
| []byte{0x2, 0xe2, 0xe2, 0x7, 0xd9, 0xed, 0xea, 0x90, 0x33}, // Read([0 0 0 0 0 0 0 0 0]) |
| []byte{0x5d, 0xaa, 0xb8, 0xc6, 0x39, 0xfb, 0xbe, 0x56, 0x7, 0xa3}, // Read([0 0 0 0 0 0 0 0 0 0]) |
| []byte{0x62}, // Read([0]) |
| []byte{0x4d, 0x63, 0xa6, 0x4b, 0xb4, 0x1f, 0x42}, // Read([0 0 0 0 0 0 0]) |
| []byte{0x66, 0x42, 0x62, 0x36, 0x42, 0x20, 0x8d, 0xb4}, // Read([0 0 0 0 0 0 0 0]) |
| []byte{0x9f, 0xa3, 0x67, 0x1, 0x91, 0xea, 0x34, 0xb6, 0xa}, // Read([0 0 0 0 0 0 0 0 0]) |
| []byte{0xd, 0xa8, 0x43, 0xb, 0x1, 0x93, 0x8a, 0x56, 0xfc, 0x98}, // Read([0 0 0 0 0 0 0 0 0 0]) |
| |
| uint32(3422128433), // Uint32() |
| uint32(1301854491), // Uint32() |
| uint32(17236374), // Uint32() |
| uint32(1883162688), // Uint32() |
| uint32(3846788241), // Uint32() |
| uint32(2517831666), // Uint32() |
| uint32(2107629301), // Uint32() |
| uint32(1718611668), // Uint32() |
| uint32(2552195159), // Uint32() |
| uint32(2910875917), // Uint32() |
| uint32(3791832192), // Uint32() |
| uint32(1563660522), // Uint32() |
| uint32(123125499), // Uint32() |
| uint32(531909542), // Uint32() |
| uint32(2367701558), // Uint32() |
| uint32(887787777), // Uint32() |
| uint32(2466319171), // Uint32() |
| uint32(1715318922), // Uint32() |
| uint32(1913326099), // Uint32() |
| uint32(741689406), // Uint32() |
| |
| uint64(14697929703826476783), // Uint64() |
| uint64(5591422465364813936), // Uint64() |
| uint64(74029666500212977), // Uint64() |
| uint64(8088122161323000979), // Uint64() |
| uint64(16521829690994476282), // Uint64() |
| uint64(10814004662382438494), // Uint64() |
| uint64(9052198920789078554), // Uint64() |
| uint64(7381380909356947872), // Uint64() |
| uint64(10961594741481288303), // Uint64() |
| uint64(12502116868085730778), // Uint64() |
| uint64(16285795259516428329), // Uint64() |
| uint64(6715870808026712034), // Uint64() |
| uint64(528819992478005418), // Uint64() |
| uint64(2284534088986354339), // Uint64() |
| uint64(10169200759946765890), // Uint64() |
| uint64(3813019469742317492), // Uint64() |
| uint64(10592760183762258614), // Uint64() |
| uint64(7367238674766648970), // Uint64() |
| uint64(8217673022687244206), // Uint64() |
| uint64(3185531743396549562), // Uint64() |
| |
| uint64(0), // Uint64n(1) |
| uint64(6), // Uint64n(10) |
| uint64(17), // Uint64n(32) |
| uint64(1000595), // Uint64n(1048576) |
| uint64(424333), // Uint64n(1048577) |
| uint64(382438494), // Uint64n(1000000000) |
| uint64(902738458), // Uint64n(1073741824) |
| uint64(1204933878), // Uint64n(2147483646) |
| uint64(1376191263), // Uint64n(2147483647) |
| uint64(502116868085730778), // Uint64n(1000000000000000000) |
| uint64(144894195020570665), // Uint64n(1152921504606846976) |
| uint64(6715870808026712034), // Uint64n(18446744073709551614) |
| uint64(528819992478005418), // Uint64n(18446744073709551615) |
| uint64(0), // Uint64n(1) |
| uint64(0), // Uint64n(10) |
| uint64(20), // Uint64n(32) |
| uint64(854710), // Uint64n(1048576) |
| uint64(649893), // Uint64n(1048577) |
| uint64(687244206), // Uint64n(1000000000) |
| uint64(836883386), // Uint64n(1073741824) |
| } |