github.com/jingcheng-WU/gonum@v0.9.1-0.20210323123734-f1a2a11a8f7b/internal/testrand/rand.go (about)

     1  // Copyright ©2020 The Gonum Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  // Package testrand provides random generation and flags for testing.
     6  package testrand
     7  
     8  import (
     9  	"flag"
    10  
    11  	"golang.org/x/exp/rand"
    12  )
    13  
    14  var (
    15  	seedFlag    = flag.Uint64("testrand.seed", 1, "random seed for tests (0=randomize)")
    16  	extremeFlag = flag.Float64("testrand.extreme", 0, "probability of returning extreme values")
    17  	nanFlag     = flag.Float64("testrand.nan", 0, "probability of returning nan")
    18  )
    19  
    20  // TB is an interface that corresponds to a subset of *testing.T and *testing.B.
    21  type TB interface {
    22  	Logf(format string, args ...interface{})
    23  }
    24  
    25  // Source corresponds to the interface in golang.org/x/exp/rand.Source.
    26  type Source = rand.Source
    27  
    28  // Rand corresponds to golang.org/x/exp/rand.Rand.
    29  type Rand interface {
    30  	ExpFloat64() float64
    31  	Float32() float32
    32  	Float64() float64
    33  	Int() int
    34  	Int31() int32
    35  	Int31n(n int32) int32
    36  	Int63() int64
    37  	Int63n(n int64) int64
    38  	Intn(n int) int
    39  	NormFloat64() float64
    40  	Perm(n int) []int
    41  	Read(p []byte) (n int, err error)
    42  	Seed(seed uint64)
    43  	Shuffle(n int, swap func(i, j int))
    44  	Uint32() uint32
    45  	Uint64() uint64
    46  	Uint64n(n uint64) uint64
    47  }
    48  
    49  // New returns a new random number generator using the global flags.
    50  func New(tb TB) Rand {
    51  	seed := *seedFlag
    52  	if seed == 0 {
    53  		seed = rand.Uint64()
    54  	}
    55  
    56  	// Don't log the default case.
    57  	if seed == 1 && *extremeFlag == 0 && *nanFlag == 0 {
    58  		base := rand.New(rand.NewSource(seed))
    59  		return base
    60  	}
    61  
    62  	tb.Logf("seed=%d, prob=%.2f, nan=%.2f", seed, *extremeFlag, *nanFlag)
    63  
    64  	base := rand.New(rand.NewSource(seed))
    65  	if *extremeFlag <= 0 && *nanFlag <= 0 {
    66  		return base
    67  	}
    68  
    69  	return newExtreme(*extremeFlag, *nanFlag, base)
    70  }
    71  
    72  // NewSource returns a new source for random numbers.
    73  func NewSource(tb TB) Source {
    74  	seed := *seedFlag
    75  	if seed == 0 {
    76  		seed = rand.Uint64()
    77  	}
    78  
    79  	// Don't log the default case.
    80  	if seed == 1 {
    81  		return rand.NewSource(seed)
    82  	}
    83  
    84  	tb.Logf("seed %d", seed)
    85  	return rand.NewSource(seed)
    86  }