В действительности псевдослучайные числа вовсе не случайны. Они вычисляются с использованием фиксированного детерминированного алгоритма.
Начальное число является отправной точкой для последовательности псевдослучайных чисел. Если вы начинаете с того же семени, вы получаете ту же последовательность. Это может быть очень полезно для отладки.
Если вам нужна разная последовательность чисел каждый раз, вы можете использовать текущее время в качестве начального числа.
Пример
Этот генератор производит последовательность из 97 различных чисел, затем он запускается снова. seed решает, с какого числа начнется последовательность.
// New возвращает генератор псевдослучайных чисел Rand
// с заданным начальным числом.
// Каждый раз, когда вы вызываете Rand,
// вы получаете новое "случайное" число.
func New(seed int) (Rand func() int) {
current := seed
return func() int {
next := (17 * current) % 97
current = next
return next
}
}
func main() {
rand1 := New(1)
fmt.Println(rand1(), rand1(), rand1())
rand2 := New(2)
fmt.Println(rand2(), rand2(), rand2())
}
Вывод:
17 95 63
34 93 29
Генераторы случайных чисел, которые вы найдете в большинстве языков программирования, работают точно так же, но, конечно, они используют более умную функцию. В идеале вам нужна длинная последовательность с хорошими случайными свойствами, вычисляемая функцией, которая использует только дешевые арифметические операции. Например, вы обычно хотели бы избежать % оператор модуля.
Читайте также:
- Go Code Review Comments: Пакет Crypto Rand
- Пакеты в Golang: объявление, импорт, загрузка, документирование
- Генерация случайных чисел, символов и элементов срезов в Golang
Комментариев нет:
Отправить комментарий