// 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.

// Package rand implements pseudo-random number generators.
package rand

// A Source represents a source of uniformly-distributed
// pseudo-random int64 values in the range [0, 1<<63).
type Source interface {
	Int63() int64;
	Seed(seed int64);
}

// NewSource returns a new pseudo-random Source seeded with the given value.
func NewSource(seed int64) Source {
	var rng rngSource;
	rng.Seed(seed);
	return &rng;
}

// A Rand is a source of random numbers.
type Rand struct {
	src Source;
}

// New returns a new Rand that uses random values from src
// to generate other random values.
func New(src Source) *Rand	{ return &Rand{src} }

// Seed uses the provided seed value to initialize the generator to a deterministic state.
func (r *Rand) Seed(seed int64)	{ r.src.Seed(seed) }

// Int63 returns a non-negative pseudo-random 63-bit integer as an int64.
func (r *Rand) Int63() int64	{ return r.src.Int63() }

// Uint32 returns a pseudo-random 32-bit value as a uint32.
func (r *Rand) Uint32() uint32	{ return uint32(r.Int63() >> 31) }

// Int31 returns a non-negative pseudo-random 31-bit integer as an int32.
func (r *Rand) Int31() int32	{ return int32(r.Int63() >> 32) }

// Int returns a non-negative pseudo-random int.
func (r *Rand) Int() int {
	u := uint(r.Int63());
	return int(u << 1 >> 1);	// clear sign bit if int == int32
}

// Int63n returns, as an int64, a non-negative pseudo-random number in [0,n).
func (r *Rand) Int63n(n int64) int64 {
	if n <= 0 {
		return 0
	}
	max := int64((1 << 63) - 1 - (1<<63)%uint64(n));
	v := r.Int63();
	for v > max {
		v = r.Int63()
	}
	return v % n;
}

// Int31n returns, as an int32, a non-negative pseudo-random number in [0,n).
func (r *Rand) Int31n(n int32) int32	{ return int32(r.Int63n(int64(n))) }

// Intn returns, as an int, a non-negative pseudo-random number in [0,n).
func (r *Rand) Intn(n int) int	{ return int(r.Int63n(int64(n))) }

// Float64 returns, as a float64, a pseudo-random number in [0.0,1.0).
func (r *Rand) Float64() float64	{ return float64(r.Int63()) / (1 << 63) }

// Float32 returns, as a float32, a pseudo-random number in [0.0,1.0).
func (r *Rand) Float32() float32	{ return float32(r.Float64()) }

// Float returns, as a float, a pseudo-random number in [0.0,1.0).
func (r *Rand) Float() float	{ return float(r.Float64()) }

// Perm returns, as a slice of n ints, a pseudo-random permutation of the integers [0,n).
func (r *Rand) Perm(n int) []int {
	m := make([]int, n);
	for i := 0; i < n; i++ {
		m[i] = i
	}
	for i := 0; i < n; i++ {
		j := r.Intn(i + 1);
		m[i], m[j] = m[j], m[i];
	}
	return m;
}

/*
 * Top-level convenience functions
 */

var globalRand = New(NewSource(1))

// Seed uses the provided seed value to initialize the generator to a deterministic state.
func Seed(seed int64)	{ globalRand.Seed(seed) }

// Int63 returns a non-negative pseudo-random 63-bit integer as an int64.
func Int63() int64	{ return globalRand.Int63() }

// Uint32 returns a pseudo-random 32-bit value as a uint32.
func Uint32() uint32	{ return globalRand.Uint32() }

// Int31 returns a non-negative pseudo-random 31-bit integer as an int32.
func Int31() int32	{ return globalRand.Int31() }

// Int returns a non-negative pseudo-random int.
func Int() int	{ return globalRand.Int() }

// Int63n returns, as an int64, a non-negative pseudo-random number in [0,n).
func Int63n(n int64) int64	{ return globalRand.Int63n(n) }

// Int31n returns, as an int32, a non-negative pseudo-random number in [0,n).
func Int31n(n int32) int32	{ return globalRand.Int31n(n) }

// Intn returns, as an int, a non-negative pseudo-random number in [0,n).
func Intn(n int) int	{ return globalRand.Intn(n) }

// Float64 returns, as a float64, a pseudo-random number in [0.0,1.0).
func Float64() float64	{ return globalRand.Float64() }

// Float32 returns, as a float32, a pseudo-random number in [0.0,1.0).
func Float32() float32	{ return globalRand.Float32() }

// Float returns, as a float, a pseudo-random number in [0.0,1.0).
func Float() float	{ return globalRand.Float() }

// Perm returns, as a slice of n ints, a pseudo-random permutation of the integers [0,n).
func Perm(n int) []int	{ return globalRand.Perm(n) }

// NormFloat64 returns a normally distributed float64 in the range
// [-math.MaxFloat64, +math.MaxFloat64] with
// standard normal distribution (mean = 0, stddev = 1).
// To produce a different normal distribution, callers can
// adjust the output using:
//
//  sample = NormFloat64() * desiredStdDev + desiredMean
//
func NormFloat64() float64	{ return globalRand.NormFloat64() }

// ExpFloat64 returns an exponentially distributed float64 in the range
// (0, +math.MaxFloat64] with an exponential distribution whose rate parameter
// (lambda) is 1 and whose mean is 1/lambda (1).
// To produce a distribution with a different rate parameter,
// callers can adjust the output using:
//
//  sample = ExpFloat64() / desiredRateParameter
//
func ExpFloat64() float64	{ return globalRand.ExpFloat64() }
