В следующей инструкции показано, как написать программу для генерации случайных чисел. Данную функциональность предоставляет пакет math/rand
. Случайные числа, сгенерированные через math/rand
считаются криптографически ненадежными, так как из-за использования определенного сида последовательности повторяются.
Для генерации криптографически надежных чисел лучше использовать пакет crypto/rand
, где последовательности не повторяются.
Рекомендуем вам супер TELEGRAM канал по Golang где собраны все материалы для качественного изучения языка. Удивите всех своими знаниями на собеседовании! 😎
Мы публикуем в паблике ВК и Telegram качественные обучающие материалы для быстрого изучения Go. Подпишитесь на нас в ВК и в Telegram. Поддержите сообщество Go программистов.
Как генерировать случайные числа в Golang?
1. Создайте файл rand.go
со следующим содержимым:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
package main import ( crypto "crypto/rand" "fmt" "math/big" "math/rand" ) func main() { sec1 := rand.New(rand.NewSource(10)) sec2 := rand.New(rand.NewSource(10)) for i := 0; i < 5; i++ { rnd1 := sec1.Int() rnd2 := sec2.Int() if rnd1 != rnd2 { fmt.Println("Сгенерированная случайным образом неравная последовательность") break } else { fmt.Printf("Math/Rand1: %d , Math/Rand2: %d\n", rnd1, rnd2) } } for i := 0; i < 5; i++ { safeNum := NewCryptoRand() safeNum2 := NewCryptoRand() if safeNum == safeNum2 { fmt.Println("Криптографически сгенерированные равные числа") break } else { fmt.Printf("Crypto/Rand1: %d , Crypto/Rand2: %d\n", safeNum, safeNum2) } } } func NewCryptoRand() int64 { safeNum, err := crypto.Int(crypto.Reader, big.NewInt(100234)) if err != nil { panic(err) } return safeNum.Int64() } |
2. Запустите код в терминале через go run rand.go
;
3. Посмотрите на вывод:
1 2 3 4 5 6 7 8 9 10 |
Math/Rand1: 1512982403 , Math/Rand2: 1512982403 Math/Rand1: 938371728 , Math/Rand2: 938371728 Math/Rand1: 1727441275 , Math/Rand2: 1727441275 Math/Rand1: 492959835 , Math/Rand2: 492959835 Math/Rand1: 1031730807 , Math/Rand2: 1031730807 Crypto/Rand1: 11434 , Crypto/Rand2: 50243 Crypto/Rand1: 71533 , Crypto/Rand2: 39072 Crypto/Rand1: 59206 , Crypto/Rand2: 87855 Crypto/Rand1: 40397 , Crypto/Rand2: 90646 Crypto/Rand1: 2463 , Crypto/Rand2: 62062 |
В предыдущем коде показано два варианта генерации случайных чисел. Первый вариант использует пакет math/rand
, что криптографически ненадежен. Он позволяет генерировать одинаковую последовательность с использованием Source
с тем же номером сида. Данный подход обычно используется в тестах. Причина этого заключается в воспроизводимости последовательности.
Второй вариант является криптографически надежным, он использует пакет crypto/rand
. API использует Reader
для предоставления экземпляра криптографически сильного генератора псевдо-случайных чисел. Данный пакет сам по себе имеет свой Reader
по умолчанию, который основан на системном генераторе случайных чисел.
Администрирую данный сайт с целью распространения как можно большего объема обучающего материала для языка программирования Go. В IT с 2008 года, с тех пор изучаю и применяю интересующие меня технологии. Проявляю огромный интерес к машинному обучению и анализу данных.
E-mail: vasile.buldumac@ati.utm.md
Образование
Технический Университет Молдовы (utm.md), Факультет Вычислительной Техники, Информатики и Микроэлектроники
- 2014 — 2018 Universitatea Tehnică a Moldovei, ИТ-Инженер. Тема дипломной работы «Автоматизация покупки и продажи криптовалюты используя технический анализ»
- 2018 — 2020 Universitatea Tehnică a Moldovei, Магистр, Магистерская диссертация «Идентификация человека в киберпространстве по фотографии лица»