Golang의 위조 랜덤수
1746 단어 Go
package main
import (
"fmt"
"math/rand"
)
func main() {
fmt.Println(rand.Int()) // => 134020434
}
위의 코드에서 우리는rand를 통과했다.Int () 방법으로 위조 무작위 수를 생성합니다.아무 문제 없을 것 같은데, 그 사람도 OK야.
그러나 세심하게 살펴보면 네가 자신의 컴퓨터에서 실행하는 코드가 뜻밖에도 나의 것과 같다는 것을 발견할 수 있을 것이다.네가 어떻게 운행하든지 간에 그것은 모두 같다.
우리는 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)
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Golang과 DB를 연결하여 주가 데이터를 그래프로 표시합니다.진화 제작된 프로그램. 지난번에 한 품종에 집중되어 데이터를 보였는데, 이번에는 텍스트 상자에 입력한 품종 코드를 바탕으로 나는 도표를 표시하는 기능을 만들고 싶다. html에서 텍스트 상자와 단추를 준비하세요. w...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.