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