Spec-Zone.ru › Go

Пакет rand

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

Обзор

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

Случайные числа генерируются источником Source, обычно обёрнутым в 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
  • type 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
  • type Source
  • func NewSource(seed int64) Source
  • type Source64
  • type 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]], с параметром интенсивности (lambda), равным 1, и математическим ожиданием 1/lambda (1), используя Source по умолчанию. Чтобы получить распределение с другим параметром интенсивности, вызывающий код может скорректировать результат следующим образом:

sample = ExpFloat64() / desiredRateParameter

func Float32

func Float32() float32

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

func Float64

func Float64() float64

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

func Int

func Int() int

Int возвращает неотрицательное псевдослучайное значение типа int, используя Source по умолчанию.

func Int31

func Int31() int32

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

func Int31n

func Int31n(n int32) int32

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

func Int63

func Int63() int64

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

func Int63n

func Int63n(n int64) int64

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

func Intn

func Intn(n int) int

Intn возвращает в виде int неотрицательное псевдослучайное число из полуоткрытого интервала [0,n), используя Source по умолчанию. Вызывает панику, если 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), используя Source по умолчанию. Чтобы получить другое нормальное распределение, вызывающий код может скорректировать результат следующим образом:

sample = NormFloat64() * desiredStdDev + desiredMean

func Perm

func Perm(n int) []int

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

Пример

Код:

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) случайных байт из Source по умолчанию и записывает их в p. Всегда возвращает len(p) и nil в качестве ошибки. В отличие от метода Rand.Read, Read безопасно использовать одновременно из нескольких горутин.

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

func Seed

func Seed(seed int64)

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

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

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

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

Начиная с Go 1.24 вызов Seed ничего не делает. Чтобы восстановить прежнее поведение, задайте GODEBUG=randseednop=0.

func Shuffle 1.10

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

Shuffle псевдослучайно перемешивает порядок элементов, используя Source по умолчанию. 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, используя Source по умолчанию.

func Uint64 1.8

func Uint64() uint64

Uint64 возвращает псевдослучайное 64-битное значение в виде uint64, используя Source по умолчанию.

type 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]], с параметром интенсивности (lambda), равным 1, и математическим ожиданием 1/lambda (1). Чтобы получить распределение с другим параметром интенсивности, вызывающий код может скорректировать результат следующим образом:

sample = ExpFloat64() / desiredRateParameter

func (*Rand) Float32

func (r *Rand) Float32() float32

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

func (*Rand) Float64

func (r *Rand) Float64() float64

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

func (*Rand) Int

func (r *Rand) Int() 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 возвращает в виде int32 неотрицательное псевдослучайное число из полуоткрытого интервала [0,n). Вызывает панику, если n <= 0.

func (*Rand) Int63

func (r *Rand) Int63() int64

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

func (*Rand) Int63n

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

Int63n возвращает в виде int64 неотрицательное псевдослучайное число из полуоткрытого интервала [0,n). Вызывает панику, если 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 значений int псевдослучайную перестановку целых чисел из полуоткрытого интервала [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 не следует вызывать одновременно с любым другим методом 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.

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

type Source64 1.8

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

type Source64 interface {
    Source
    Uint64() uint64
}

type Zipf

Zipf генерирует случайные значения с распределением Ципфа.

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

func NewZipf

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

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

func (*Zipf) Uint64

func (z *Zipf) Uint64() uint64

Uint64 возвращает значение, выбранное из распределения Zipf, описанного объектом 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