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