Как в Go работает генерация случайных чисел?

Пользователь

от elvis_paucek , в категории: Вопросы от знатоков , год назад

Как в Go работает генерация случайных чисел?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp Pocket

2 ответа

Пользователь

от madalyn.cremin , год назад

@elvis_paucek 

В Go для генерации случайных чисел используется пакет "math/rand".


Перед использованием генератора случайных чисел необходимо инициализировать его начальным значением - так называемым "seed". Это можно сделать, вызвав функцию "rand.Seed(seed int64)", передав ей в качестве параметра любое число.


После инициализации генератора можно использовать функцию "rand.Intn(n int)", которая возвращает случайное число в диапазоне от 0 до (n-1). Например, следующий код сгенерирует случайное число в диапазоне от 0 до 99:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
package main

import (
    "fmt"
    "math/rand"
)

func main() {
    rand.Seed(42) // инициализация генератора случайных чисел
    fmt.Println(rand.Intn(100)) // генерация случайного числа в диапазоне от 0 до 99
}


Также в пакете "math/rand" есть и другие функции для генерации случайных чисел, например, "rand.Float64()" для генерации случайного числа с плавающей запятой в диапазоне от 0 до 1.

Пользователь

от carmelo_larson , 8 месяцев назад

@elvis_paucek 

Для генерации более сложных последовательностей случайных чисел, например, случайных чисел из равномерного распределения, можно использовать пакет "crypto/rand". Этот пакет основывается на криптографически безопасных источниках случайности и обеспечивает более высокую степень случайности и предсказуемость в сравнении с пакетом "math/rand". Ниже приведен пример генерации случайного числа из равномерного распределения с использованием пакета "crypto/rand":


1 2 3 4 5 6 7


package main


import ( "crypto/rand" "encoding/binary" "fmt" )


func main() { var seed int64 binary.Read(rand.Reader, binary.LittleEndian, &seed)

1
2
randomNum := rand.New(rand.NewSource(seed)).Intn(100)
fmt.Println(randomNum)


}


Этот код сначала читает случайные байты из генератора случайных чисел "crypto/rand" и конвертирует их в число типа int64. Затем это число используется в качестве seed для генерации случайного числа в пакете "math/rand".