Go の rand.Intn() での同一の乱数生成を理解する
rand.Intn() はなぜ一貫して同じ乱数を生成するのでしょうか?この疑問は、次のコードが原因で Go を使用する初心者によく起こります:
<code class="go">package main import ( "fmt" "math/rand" ) func main() { fmt.Println(rand.Intn(10)) }</code>
ドキュメントでは [0, n) の範囲の疑似乱数を提供すると主張しているにもかかわらず、プログラムは毎回同じ数値を出力します。 time.
乱数生成のシード
重要なのは、乱数ジェネレーターを適切にシードすることにあります。デフォルトの動作では、決定論的なシードが使用され、プログラムの実行全体で同じ数値のシーケンスが生成されます。これを修正するには:
<code class="go">rand.Seed(time.Now().UnixNano())</code>
この関数は、現在の Unix タイムスタンプに基づくシードを使用して乱数ジェネレーターを初期化します。これにより、実行ごとに異なる数値シーケンスが保証されます。
ドキュメントの理解
rand.Intn() のドキュメントには次のように記載されています。「トップレベル関数 ...プログラムが実行されるたびに、決定的な一連の値が生成されます。」したがって、明示的にシードを行わないと、ジェネレータは 1 でシードされているかのように動作し、予測可能な結果が得られます。
結論
rand.Intn を使用する前に乱数ジェネレータをシードすることにより、 () を使用すると、乱数の繰り返しの問題を克服し、非決定的なシーケンスを適切に生成できます。
以上がGo の `rand.Intn()` が毎回同じ数値を生成するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。