|  | // 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) | 
|  | } |