В действительности псевдослучайные числа вовсе не случайны. Они вычисляются с использованием фиксированного детерминированного алгоритма.
Начальное число является отправной точкой для последовательности псевдослучайных чисел. Если вы начинаете с того же семени, вы получаете ту же последовательность. Это может быть очень полезно для отладки.
Если вам нужна разная последовательность чисел каждый раз, вы можете использовать текущее время в качестве начального числа.
Пример
Этот генератор производит последовательность из 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

Комментариев нет:
Отправить комментарий