Все мы знаем, что случайное число — это число, которое «случайным образом» генерируется компьютером с помощью некоторого алгоритма. Многие языки программирования имеют встроенные методы генерации случайных чисел, так как обстоят дела в GoLang?
Псевдослучайное число
Мы все знаем понятие «случайное число» в реальной жизни.Может быть, если подбросить монетку наугад, можно сказать, что результат случайный, но в компьютере определить, что «случайное число» на самом деле является «случайным числом». ", то Но есть стандарты, просто так не скажешь.
Согласно принципам криптографии существует несколько критериев проверки случайности «случайного числа»:
- Статистическая псевдослучайность. В данной выборке случайного битового потока количество единиц примерно равно количеству нулей, то есть «10», «01», «00» и «11» примерно равны по количеству. Говоря человеческими словами: «На первый взгляд это выглядит случайным».
- Криптографически безопасная псевдослучайность, то есть при наличии части случайной выборки и случайного алгоритма оставшаяся часть случайной выборки не может быть эффективно вычислена.
- Истинная случайность – определяется как случайная выборка, которая не воспроизводима.
По вышеуказанным критериям соответствующие случайные числа делятся на следующие категории:
- Псевдослучайное число — случайное число, удовлетворяющее первому условию.
- Криптографически безопасные псевдослучайные числа — случайные числа, удовлетворяющие обоим первым двум условиям. Его можно рассчитать с помощью криптографически безопасного генератора псевдослучайных чисел.
- Истинное случайное число — случайное число, удовлетворяющее всем трем условиям одновременно.
После понимания приведенных выше концепций мы знаем, что «псевдослучайное число» на самом деле является числом, которое «кажется случайным, но на самом деле не является случайным».
Генератор псевдослучайных чисел
В большинстве случаев для практических приложений достаточно псевдослучайных чисел. Эти последовательности являются «кажущимися» случайными числами, хотя на самом деле они генерируются фиксированным, повторяемым методом вычислений. Поскольку они действительно вычислимы, они не являются по-настоящему случайными, но обладают статистическими свойствами, подобными случайным числам. Генераторы, выдающие такие результаты, называются генераторами псевдослучайных чисел.
Как правило, только в криптографических сценариях нам нужно использовать «настоящие случайные числа».
В большинстве языков программирования предусмотрены «генераторы псевдослучайных чисел», например.JS
серединаMath.random()
,GoLang
серединаmath/rand
Сумка.
Псевдослучайные числа в GoLang
существуетGoLang
, мы можем пройтиmath/rand
пакет для генерации псевдослучайного числа:
package main
import (
"fmt"
"math/rand"
)
func main() {
fmt.Println(rand.Int()) // => 134020434
}
В приведенном выше коде мы передаемrand.Int()
Метод генерации псевдослучайного числа. Это не проблема, и люди в порядке.
Но если вы будете осторожны, вы обнаружите, что приведенный выше код, который вы запускаете на своем компьютере, такой же, как у меня. Это то же самое, независимо от того, как вы его запускаете.
мы знаемJS
серединаMath.random()
каждый раз возвращает другое число, ноGoLang
Генератор псевдослучайных чисел в , по умолчанию, возвращает одно и то же значение, разве не наоборот?
Оба являются генераторами псевдослучайных чисел, почему такая большая разница? Здесь нам нужно понять концепцию «случайного начального числа».
случайное зерно
Мы знаем, что псевдослучайные числа рассчитываются с использованием детерминированного алгоритма, который выглядит как случайная последовательность чисел, поэтому псевдослучайные числа на самом деле не являются случайными.
Так что естественно, если начальное значение, используемое при вычислении псевдослучайного числа, останется неизменным, то и числовая последовательность вычисляемого алгоритмом псевдослучайного числа, естественно, останется неизменной.
Это «начальное значение» называется случайным начальным числом.
чекДокументация, мы узнаем, чтоInt()
функция изdefault Source
(источник по умолчанию) Псевдослучайные числа, сгенерированные в.
и этоdefault Source
, мы начинаем сSeedразделе вы можете видеть, что если вы не установите случайное начальное число, то начальное начальное число по умолчанию всегда будет из1
Начинать.
Поскольку случайное начальное число одинаково, результат, естественно, будет таким же.
случайное псевдослучайное число
Мы уже знаем, что случайным начальным числом по умолчанию является1
В начале, пока мы устанавливаем разные начальные числа перед генерацией случайных чисел каждый раз, результат, естественно, будет другим.
Мы хотим гарантировать, что каждый раз, когда работает генератор псевдослучайных чисел, используется другое начальное число, и обычно в качестве начального значения используется текущее время.
package main
import (
"fmt"
"math/rand"
"time"
)
func main() {
rand.Seed(int64(time.Now().UnixNano()))
fmt.Println(rand.Int())
}
Таким образом, поскольку семена разные, мы получаем разные результаты при каждом запуске. Мы можем достичь цели получения псевдослучайных чисел.
истинное случайное число
Если наше приложение предъявляет высокие требования к безопасности и должно использовать настоящие случайные числа, то мы можем использоватьcrypto/rand
методы в пакете.
package main
import (
"crypto/rand"
"fmt"
"math/big"
)
func main() {
// 生成 20 个 [0, 100) 范围的真随机数。
for i := 0; i < 20; i++ {
result, _ := rand.Int(rand.Reader, big.NewInt(100))
fmt.Println(result)
}
}
Результат вышеприведенной программы различен каждый раз, когда она запускается, и она будет генерировать случайные числа действительно случайным образом.
доступGitHub.com/applicantthree/things…Читайте больше статей.