liyujie
2025-08-28 d9927380ed7c8366f762049be9f3fee225860833
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
// Copyright 2009 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.
 
// +build ignore
 
// This program computes the value of rng_cooked in rng.go,
// which is used for seeding all instances of rand.Source.
// a 64bit and a 63bit version of the array is printed to
// the standard output.
 
package main
 
import "fmt"
 
const (
   length = 607
   tap    = 273
   mask   = (1 << 63) - 1
   a      = 48271
   m      = (1 << 31) - 1
   q      = 44488
   r      = 3399
)
 
var (
   rngVec          [length]int64
   rngTap, rngFeed int
)
 
func seedrand(x int32) int32 {
   hi := x / q
   lo := x % q
   x = a*lo - r*hi
   if x < 0 {
       x += m
   }
   return x
}
 
func srand(seed int32) {
   rngTap = 0
   rngFeed = length - tap
   seed %= m
   if seed < 0 {
       seed += m
   } else if seed == 0 {
       seed = 89482311
   }
   x := seed
   for i := -20; i < length; i++ {
       x = seedrand(x)
       if i >= 0 {
           var u int64
           u = int64(x) << 20
           x = seedrand(x)
           u ^= int64(x) << 10
           x = seedrand(x)
           u ^= int64(x)
           rngVec[i] = u
       }
   }
}
 
func vrand() int64 {
   rngTap--
   if rngTap < 0 {
       rngTap += length
   }
   rngFeed--
   if rngFeed < 0 {
       rngFeed += length
   }
   x := (rngVec[rngFeed] + rngVec[rngTap])
   rngVec[rngFeed] = x
   return x
}
 
func main() {
   srand(1)
   for i := uint64(0); i < 7.8e12; i++ {
       vrand()
   }
   fmt.Printf("rngVec after 7.8e12 calls to vrand:\n%#v\n", rngVec)
   for i := range rngVec {
       rngVec[i] &= mask
   }
   fmt.Printf("lower 63bit of rngVec after 7.8e12 calls to vrand:\n%#v\n", rngVec)
}