Go での決定的乱数生成
Go では、乱数ジェネレーターをシードせずに rand.Intn(n int) int を呼び出すと、常に同じ一連の数値を返します。これは、乱数生成に使用されるデフォルトのソースが固定シードで初期化され、実質的に決定的になるためです。
なぜこれが起こるのか?
公式ドキュメントによれば、 rand.Intn 関数は、決定論的アルゴリズムとシード値を使用して生成された擬似乱数を返します。シードが指定されていない場合は、デフォルトのシード 1 が使用され、実行ごとに同じ一連の数値が生成されます。
適切なシード乱数生成
真の乱数を生成するには、実行ごとに異なるシードを乱数ジェネレータにシードすることが重要です。これは、 rand.Seed() 関数を呼び出してランダムなシード値を渡すことで実現できます。一般的な方法は、現在の Unix タイムスタンプをシードとして使用することです。これにより、ジェネレーターが実行ごとに一意の値で初期化されます。
例:
<code class="go">import ( "fmt" "math/rand" "time" ) func main() { rand.Seed(time.Now().UnixNano()) fmt.Println(rand.Intn(10)) }</code>
結論
乱数ジェネレーターを適切にシードすることで、Go プログラムが真の乱数を生成し、予測不可能で真の乱数をより表現できるようになります。
以上がGo でシードなしで「rand.Intn」を呼び出すと同じ一連の数値が得られるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。