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
12package rand_test
13
14import (
15	"flag"
16	"fmt"
17	. "math/rand"
18	"reflect"
19	"testing"
20)
21
22var printgolden = flag.Bool("printgolden", false, "print golden results for regression test")
23
24func 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
123var 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}
405