Пакет 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]
Указатель
Файлы пакета
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/