...
Run Format

Source file src/math/rand/gen_cooked.go

Documentation: math/rand

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

View as plain text