Golang의 위조 랜덤수

1746 단어 Go
GoLang에서, 우리는 math/rand 가방의 방법을 통해 위조 무작위 수를 생성할 수 있다.
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)
 }
}

좋은 웹페이지 즐겨찾기