Go の Rand パッケージでの予測可能な擬似乱数生成を克服する
Go の rand パッケージは擬似乱数を生成する手段を提供しますが、デフォルトではこれらの同じプログラムの実行に対して番号が繰り返される場合があります。これは、本当にランダムな結果を求める場合に問題となる可能性があります。
問題の特定:
次の Go コードを検討してください:
package main import ( "fmt" "rand" ) func main() { fmt.Println(rand.Int31n(100)) }
これを実行するとコードを実行すると、毎回同じ乱数が生成されることがわかります。これは、rand パッケージが疑似乱数生成器を定数シードで初期化し、予測可能な結果をもたらすために発生します。
解決策:
実行ごとに一意の乱数を確保するには、乱数を生成する前に、別のシードを提供する必要があります。一般的なアプローチは、現在時刻をシードとして使用することです。
import ( "fmt" "rand" "time" ) func main() { // Initialize the random generator with the current time in nanoseconds rand.Seed(time.Now().UnixNano()) fmt.Println(rand.Int31n(100)) }
シードを現在時刻のように常に変化する値に設定すると、プログラムの実行ごとに一意の擬似乱数シーケンスが得られます。
>機密性の高いアプリケーションの代替案:
より安全な乱数生成を必要とするアプリケーションの場合、 crypto/rand パッケージの利用を検討してください。ユーザーのマウスの動きやシステムの熱などのエントロピー ソースを利用して、より安全なランダム値を生成します。ただし、これにはパフォーマンスが犠牲になります。
結論:
シードを現在の時刻などの動的な値に設定することで、シードの予測可能性を克服できます。 Go の rand パッケージを使用して、真の乱数を生成します。このアプローチはほとんどのアプリケーションに適していますが、安全性の高いシナリオでは crypto/rand パッケージを考慮する必要があります。
以上がGo の Rand パッケージを使用して一意の乱数を生成するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。