Генерация случайных чисел в Go: методы и примеры кода

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

Метод 1: использование пакета math/rand
Стандартная библиотека Go предоставляет пакет math/rand, который предлагает простой и эффективный способ генерации псевдослучайных чисел. Псевдослучайные числа генерируются с помощью алгоритма, и хотя они кажутся случайными, на самом деле они детерминированы. Вот пример генерации случайного целого числа с помощью пакета math/rand:

package main
import (
    "fmt"
    "math/rand"
    "time"
)
func main() {
    rand.Seed(time.Now().UnixNano())
    randomNumber := rand.Intn(100)
    fmt.Println(randomNumber)
}

Метод 2. Генерация криптографически безопасных случайных чисел
Если вам нужны случайные числа для криптографических целей, например для генерации ключей шифрования или безопасных токенов, вам следует использовать пакет crypto/rand. Пакет crypto/rand обеспечивает более безопасный способ генерации случайных чисел с использованием источника энтропии операционной системы. Вот пример генерации криптографически безопасного случайного числа:

package main
import (
    "crypto/rand"
    "fmt"
    "math/big"
)
func main() {
    randomNumber, _ := rand.Int(rand.Reader, big.NewInt(100))
    fmt.Println(randomNumber)
}

Метод 3: перетасовка элементов в срезе.
Другой распространенный вариант использования — перетасовка элементов внутри среза. Для этой цели часто используется алгоритм перемешивания Фишера-Йейтса. Вот пример перетасовки фрагмента целых чисел:

package main
import (
    "fmt"
    "math/rand"
    "time"
)
func main() {
    rand.Seed(time.Now().UnixNano())
    numbers := []int{1, 2, 3, 4, 5}
    rand.Shuffle(len(numbers), func(i, j int) {
        numbers[i], numbers[j] = numbers[j], numbers[i]
    })
    fmt.Println(numbers)
}

В этой статье мы рассмотрели различные методы генерации случайных чисел в Go. Мы обсудили использование пакета math/rand для псевдослучайных чисел, пакета crypto/rand для криптографически безопасных случайных чисел и перетасовку элементов внутри среза. В зависимости от ваших конкретных требований вы можете выбрать подходящий метод генерации случайных чисел в ваших программах Go.