воскресенье, 26 апреля 2020 г.

Что такое seed (начальное число, семя) в генераторе случайных чисел?

В действительности псевдослучайные числа вовсе не случайны. Они вычисляются с использованием фиксированного детерминированного алгоритма.

Начальное число является отправной точкой для последовательности псевдослучайных чисел. Если вы начинаете с того же семени, вы получаете ту же последовательность. Это может быть очень полезно для отладки.

Если вам нужна разная последовательность чисел каждый раз, вы можете использовать текущее время в качестве начального числа.

Пример

Этот генератор производит последовательность из 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

Генераторы случайных чисел, которые вы найдете в большинстве языков программирования, работают точно так же, но, конечно, они используют более умную функцию. В идеале вам нужна длинная последовательность с хорошими случайными свойствами, вычисляемая функцией, которая использует только дешевые арифметические операции. Например, вы обычно хотели бы избежать % оператор модуля.


Читайте также:


Комментариев нет:

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