ホームページ  >  記事  >  バックエンド開発  >  Go の `rand.Intn()` が毎回同じ数値を生成するのはなぜですか?

Go の `rand.Intn()` が毎回同じ数値を生成するのはなぜですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-10-30 13:25:02521ブラウズ

Why Does `rand.Intn()` in Go Generate the Same Number Every Time?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。