ホームページ >バックエンド開発 >Golang >Go でシードなしで「rand.Intn」を呼び出すと同じ一連の数値が得られるのはなぜですか?

Go でシードなしで「rand.Intn」を呼び出すと同じ一連の数値が得られるのはなぜですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-10-29 04:57:021056ブラウズ

Why Does Calling `rand.Intn` Without Seeding Result in the Same Sequence of Numbers in Go?

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

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