Spec-Zone.ru › Go

Пакет rand

  • import "math/rand"
  • Обзор
  • Индекс
  • Примеры
  • Подкаталоги

Обзор

Пакет rand реализует псевдослучайные генераторы чисел, пригодные для задач, таких как моделирование, но не следует использовать их для задач, связанных с безопасностью.

Случайные числа генерируются источником, обычно обернутым в Rand. Оба типа должны использоваться одной горутиной за раз: совместное использование между несколькими горутинами требует некоторой синхронизации.

Функции верхнего уровня, такие как Float64 и Int, безопасны для одновременного использования несколькими горутинами.

Выходные данные этого пакета могут быть легко предсказуемыми независимо от способа инициализации. Для случайных чисел, пригодных для задач, связанных с безопасностью, см. пакет crypto/rand.

Пример

Код:

answers := []string{
    "It is certain",
    "It is decidedly so",
    "Without a doubt",
    "Yes definitely",
    "You may rely on it",
    "As I see it yes",
    "Most likely",
    "Outlook good",
    "Yes",
    "Signs point to yes",
    "Reply hazy try again",
    "Ask again later",
    "Better not tell you now",
    "Cannot predict now",
    "Concentrate and ask again",
    "Don't count on it",
    "My reply is no",
    "My sources say no",
    "Outlook not so good",
    "Very doubtful",
}
fmt.Println("Magic 8-Ball says:", answers[rand.Intn(len(answers))])

Пример (Rand)

Этот пример демонстрирует использование каждого из методов на *Rand. Использование глобальных функций такое же, без получателя.

Код:

// Create and seed the generator.
// Typically a non-fixed seed should be used, such as time.Now().UnixNano().
// Using a fixed seed will produce the same output on every run.
r := rand.New(rand.NewSource(99))

// The tabwriter here helps us generate aligned output.
w := tabwriter.NewWriter(os.Stdout, 1, 1, 1, ' ', 0)
defer w.Flush()
show := func(name string, v1, v2, v3 any) {
    fmt.Fprintf(w, "%s\t%v\t%v\t%v\n", name, v1, v2, v3)
}

// Float32 and Float64 values are in [0, 1).
show("Float32", r.Float32(), r.Float32(), r.Float32())
show("Float64", r.Float64(), r.Float64(), r.Float64())

// ExpFloat64 values have an average of 1 but decay exponentially.
show("ExpFloat64", r.ExpFloat64(), r.ExpFloat64(), r.ExpFloat64())

// NormFloat64 values have an average of 0 and a standard deviation of 1.
show("NormFloat64", r.NormFloat64(), r.NormFloat64(), r.NormFloat64())

// Int31, Int63, and Uint32 generate values of the given width.
// The Int method (not shown) is like either Int31 or Int63
// depending on the size of 'int'.
show("Int31", r.Int31(), r.Int31(), r.Int31())
show("Int63", r.Int63(), r.Int63(), r.Int63())
show("Uint32", r.Uint32(), r.Uint32(), r.Uint32())

// Intn, Int31n, and Int63n limit their output to be < n.
// They do so more carefully than using r.Int()%n.
show("Intn(10)", r.Intn(10), r.Intn(10), r.Intn(10))
show("Int31n(10)", r.Int31n(10), r.Int31n(10), r.Int31n(10))
show("Int63n(10)", r.Int63n(10), r.Int63n(10), r.Int63n(10))

// Perm generates a random permutation of the numbers [0, n).
show("Perm", r.Perm(5), r.Perm(5), r.Perm(5))

Вывод:

Float32     0.2635776           0.6358173           0.6718283
Float64     0.628605430454327   0.4504798828572669  0.9562755949377957
ExpFloat64  0.3362240648200941  1.4256072328483647  0.24354758816173044
NormFloat64 0.17233959114940064 1.577014951434847   0.04259129641113857
Int31       1501292890          1486668269          182840835
Int63       3546343826724305832 5724354148158589552 5239846799706671610
Uint32      2760229429          296659907           1922395059
Intn(10)    1                   2                   5
Int31n(10)  4                   7                   8
Int63n(10)  7                   6                   3
Perm        [1 4 2 3 0]         [4 2 1 3 0]         [1 2 4 0 3]

Индекс

  • func ExpFloat64() float64
  • func Float32() float32
  • func Float64() float64
  • func Int() int
  • func Int31() int32
  • func Int31n(n int32) int32
  • func Int63() int64
  • func Int63n(n int64) int64
  • func Intn(n int) int
  • func NormFloat64() float64
  • func Perm(n int) []int
  • func Read(p []byte) (n int, err error)
  • func Seed(seed int64)
  • func Shuffle(n int, swap func(i, j int))
  • func Uint32() uint32
  • func Uint64() uint64
  • тип Rand
  • func New(src Source) *Rand
  • func (r *Rand) ExpFloat64() float64
  • func (r *Rand) Float32() float32
  • func (r *Rand) Float64() float64
  • func (r *Rand) Int() int
  • func (r *Rand) Int31() int32
  • func (r *Rand) Int31n(n int32) int32
  • func (r *Rand) Int63() int64
  • func (r *Rand) Int63n(n int64) int64
  • func (r *Rand) Intn(n int) int
  • func (r *Rand) NormFloat64() float64
  • func (r *Rand) Perm(n int) []int
  • func (r *Rand) Read(p []byte) (n int, err error)
  • func (r *Rand) Seed(seed int64)
  • func (r *Rand) Shuffle(n int, swap func(i, j int))
  • func (r *Rand) Uint32() uint32
  • func (r *Rand) Uint64() uint64
  • тип Source
  • func NewSource(seed int64) Source
  • тип Source64
  • тип Zipf
  • func NewZipf(r *Rand, s float64, v float64, imax uint64) *Zipf
  • func (z *Zipf) Uint64() uint64

Примеры

Пакет
Intn
Perm
Shuffle
Shuffle (SlicesInUnison)
Пакет (Rand)

Файлы пакета

exp.go normal.go rand.go rng.go zipf.go

func ExpFloat64

func ExpFloat64() float64

ExpFloat64 возвращает float64 с экспоненциальным распределением в диапазоне (0, +[math.MaxFloat64]] с экспоненциальным распределением, параметр скорости (лямбда) которого равен 1, а среднее значение равно 1/лямбда (1) от стандартного источника. Для создания распределения с другим параметром скорости вызывающие функции могут настроить вывод, используя:

sample = ExpFloat64() / desiredRateParameter

func Float32

func Float32() float32

Float32 возвращает псевдослучайное число в полуоткрытом интервале [0.0,1.0) в формате float32, с использованием стандартного источника.

func Float64

func Float64() float64

Float64 возвращает псевдослучайное число в полуоткрытом интервале [0.0,1.0) в формате float64, с использованием стандартного источника.

func Int

func Int() int

Int возвращает неотрицательное псевдослучайное целое число от стандартного источника.

func Int31

func Int31() int32

Int31 возвращает неотрицательное псевдослучайное 31-битное целое число в формате int32 от стандартного источника.

func Int31n

func Int31n(n int32) int32

Int31n возвращает неотрицательное псевдослучайное число в полуоткрытом интервале [0,n) в формате int32 от стандартного источника. Вызывает ошибку, если n <= 0.

func Int63

func Int63() int64

Int63 возвращает неотрицательное псевдослучайное 63-битное целое число в формате int64 от стандартного источника.

func Int63n

func Int63n(n int64) int64

Int63n возвращает неотрицательное псевдослучайное число в полуоткрытом интервале [0,n) в формате int64 от стандартного источника. Вызывает ошибку, если n <= 0.

func Intn

func Intn(n int) int

Intn возвращает неотрицательное псевдослучайное число в полуоткрытом интервале [0,n) в формате int от стандартного источника. Вызывает ошибку, если n <= 0.

Пример

Код:

fmt.Println(rand.Intn(100))
fmt.Println(rand.Intn(100))
fmt.Println(rand.Intn(100))

func NormFloat64

func NormFloat64() float64

NormFloat64 возвращает float64 с нормальным распределением в диапазоне [-math.MaxFloat64, +[math.MaxFloat64]] со стандартным нормальным распределением (среднее = 0, стандартное отклонение = 1) от стандартного источника. Для создания другого нормального распределения вызывающие функции могут настроить вывод, используя:

sample = NormFloat64() * desiredStdDev + desiredMean

func Perm

func Perm(n int) []int

Perm возвращает срез из n целых чисел, являющийся псевдослучайной перестановкой целых чисел в полуоткрытом интервале [0,n) от стандартного источника.

Пример

Код:

for _, value := range rand.Perm(3) {
    fmt.Println(value)
}

Вывод:

1
2
0

func Read 1.6

func Read(p []byte) (n int, err error)

Read генерирует len(p) случайных байтов из стандартного источника и записывает их в p. Он всегда возвращает len(p) и nil ошибку. Read, в отличие от метода Rand.Read, безопасен для одновременного использования.

Устарело: Для почти всех случаев использования crypto/rand.Read более уместен. Если требуется детерминированный источник, используйте math/rand/v2.ChaCha8.Read.

func Seed

func Seed(seed int64)

Seed использует предоставленное значение seed для инициализации стандартного источника в детерминированное состояние. Значения seed, имеющие одинаковый остаток при делении на 2³¹-1, генерируют одну и ту же псевдослучайную последовательность. Seed, в отличие от метода Rand.Seed, безопасен для одновременного использования.

Если Seed не вызывается, генератор инициализируется случайным образом при запуске программы.

До Go 1.20, генератор инициализировался как Seed(1) при запуске программы. Чтобы принудительно использовать старое поведение, вызовите Seed(1) при запуске программы. В качестве альтернативы, установите GODEBUG=randautoseed=0 в среде до любых вызовов функций в этом пакете.

Устарело: По состоянию на Go 1.20 нет причин вызывать Seed со случайным значением. Программы, вызывающие Seed с известным значением для получения определенной последовательности результатов, должны использовать New(NewSource(seed)) для получения локального генератора случайных чисел.

func Shuffle 1.10

func Shuffle(n int, swap func(i, j int))

Shuffle псевдослучайным образом меняет порядок элементов, используя стандартный источник. n — количество элементов. Shuffle вызывает ошибку, если n < 0. swap меняет местами элементы с индексами i и j.

Пример

Код:

words := strings.Fields("ink runs from the corners of my mouth")
rand.Shuffle(len(words), func(i, j int) {
    words[i], words[j] = words[j], words[i]
})
fmt.Println(words)

Пример (SlicesInUnison)

Код:

numbers := []byte("12345")
letters := []byte("ABCDE")
// Shuffle numbers, swapping corresponding entries in letters at the same time.
rand.Shuffle(len(numbers), func(i, j int) {
    numbers[i], numbers[j] = numbers[j], numbers[i]
    letters[i], letters[j] = letters[j], letters[i]
})
for i := range numbers {
    fmt.Printf("%c: %c\n", letters[i], numbers[i])
}

func Uint32

func Uint32() uint32

Uint32 возвращает псевдослучайное 32-битное значение в формате uint32 из стандартного источника.

func Uint64 1.8

func Uint64() uint64

Uint64 возвращает псевдослучайное 64-битное значение в формате uint64 из стандартного источника.

тип Rand

Rand — источник случайных чисел.

type Rand struct {
    // contains filtered or unexported fields
}

func New

func New(src Source) *Rand

New возвращает новый Rand, который использует случайные значения из src для генерации других случайных значений.

func (*Rand) ExpFloat64

func (r *Rand) ExpFloat64() float64

ExpFloat64 возвращает float64 с экспоненциальным распределением в диапазоне (0, +[math.MaxFloat64]] с экспоненциальным распределением, параметр скорости (лямбда) которого равен 1, а среднее значение равно 1/лямбда (1). Для создания распределения с другим параметром скорости вызывающие функции могут настроить вывод, используя:

sample = ExpFloat64() / desiredRateParameter

func (*Rand) Float32

func (r *Rand) Float32() float32

Float32 возвращает псевдослучайное число в полуоткрытом интервале [0.0,1.0) в формате float32.

func (*Rand) Float64

func (r *Rand) Float64() float64

Float64 возвращает псевдослучайное число в полуоткрытом интервале [0.0,1.0) в формате float64.

func (*Rand) Int

func (r *Rand) Int() int

Int возвращает неотрицательное псевдослучайное целое число.

func (*Rand) Int31

func (r *Rand) Int31() int32

Int31 возвращает неотрицательное псевдослучайное 31-битное целое число в формате int32.

func (*Rand) Int31n

func (r *Rand) Int31n(n int32) int32

Int31n возвращает неотрицательное псевдослучайное число в полуоткрытом интервале [0,n) в формате int32. Вызывает ошибку, если n <= 0.

func (*Rand) Int63

func (r *Rand) Int63() int64

Int63 возвращает неотрицательное псевдослучайное 63-битное целое число в формате int64.

func (*Rand) Int63n

func (r *Rand) Int63n(n int64) int64

Int63n возвращает неотрицательное псевдослучайное число в полуоткрытом интервале [0,n) в формате int64. Вызывает ошибку, если n <= 0.

func (*Rand) Intn

func (r *Rand) Intn(n int) int

Intn возвращает, как int, неотрицательное псевдослучайное число в полуоткрытом интервале [0,n). Возвращает ошибку, если n <= 0.

func (*Rand) NormFloat64

func (r *Rand) NormFloat64() float64

NormFloat64 возвращает число с нормальным распределением типа float64 в диапазоне от -math.MaxFloat64 до +[math.MaxFloat64] включительно, со стандартным нормальным распределением (среднее значение = 0, стандартное отклонение = 1). Для получения другого нормального распределения, вызывающие функции могут настроить вывод, используя:

sample = NormFloat64() * desiredStdDev + desiredMean

func (*Rand) Perm

func (r *Rand) Perm(n int) []int

Perm возвращает, как срез n целых чисел, псевдослучайную перестановку целых чисел в полуоткрытом интервале [0,n).

func (*Rand) Read 1.6

func (r *Rand) Read(p []byte) (n int, err error)

Read генерирует len(p) случайных байтов и записывает их в p. Он всегда возвращает len(p) и nil ошибку. Read не следует вызывать одновременно с другими методами Rand.

func (*Rand) Seed

func (r *Rand) Seed(seed int64)

Seed использует предоставленное значение seed для инициализации генератора в детерминированном состоянии. Seed не следует вызывать одновременно с другими методами Rand.

func (*Rand) Shuffle 1.10

func (r *Rand) Shuffle(n int, swap func(i, j int))

Shuffle псевдослучайным образом меняет порядок элементов. n – количество элементов. Shuffle возвращает ошибку, если n < 0. swap меняет местами элементы с индексами i и j.

func (*Rand) Uint32

func (r *Rand) Uint32() uint32

Uint32 возвращает псевдослучайное 32-битное значение как uint32.

func (*Rand) Uint64 1.8

func (r *Rand) Uint64() uint64

Uint64 возвращает псевдослучайное 64-битное значение как uint64.

тип Source

Source представляет собой источник равномерно распределенных псевдослучайных значений int64 в диапазоне [0, 1<<63).

Source не безопасен для одновременного использования несколькими горутинами.

type Source interface {
    Int63() int64
    Seed(seed int64)
}

func NewSource

func NewSource(seed int64) Source

NewSource возвращает новый псевдослучайный Source, инициализированный заданным значением. В отличие от стандартного Source, используемого в глобальных функциях, этот источник не безопасен для одновременного использования несколькими горутинами. Возвращаемый Source реализует Source64.

тип Source64 1.8

Source64 – это Source, который также может генерировать равномерно распределенные псевдослучайные значения uint64 в диапазоне [0, 1<<64) напрямую. Если у Rand r в качестве базового источника лежит Source s, который реализует Source64, то r.Uint64 возвращает результат одного вызова s.Uint64 вместо двух вызовов s.Int63.

type Source64 interface {
    Source
    Uint64() uint64
}

тип Zipf

Zipf генерирует значения, распределённые по закону ЗИФФа.

type Zipf struct {
    // contains filtered or unexported fields
}

func NewZipf

func NewZipf(r *Rand, s float64, v float64, imax uint64) *Zipf

NewZipf возвращает генератор значений, распределённых по закону ЗИФФа. Генератор генерирует значения k ∈ [0, imax] такие, что P(k) пропорционально (v + k) ** (-s). Требования: s > 1 и v >= 1.

func (*Zipf) Uint64

func (z *Zipf) Uint64() uint64

Uint64 возвращает значение, выбранное из распределения ЗИФФа, описанного объектом Zipf.

Подкаталоги

Имя Описание
..
v2 Пакет rand реализует генераторы псевдослучайных чисел, подходящие для задач, таких как моделирование, но не следует использовать для задач, требующих защиты от несанкционированного доступа.

© Google, Inc.
Licensed under the Creative Commons Attribution License 3.0.
http://golang.org/pkg/math/rand/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API