Пакет 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]
Индекс
Файлы пакета
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/