2011-11-27 12 views
9

実行ごとに真の疑似乱数を返すGo関数はありますか?私が実際に意味することは、次のコードを検討することです。Go Randパッケージの難易度

package main 

import (
    "fmt" 
    "rand" 
) 

func main() { 
    fmt.Println(rand.Int31n(100)) 
} 

このコードを実行するたびに、同じ出力が得られます。それが呼び出されるたびに異なるランダムな結果を返すメソッドがありますか?

答えて

13

(「シード」と呼ばれる)は、特定の初期値に基づいて生成された擬似乱数を生成するために使用することができますrandパッケージです。

この初期シードの一般的な選択は、たとえば、現在の時間(ナノ秒単位)です。これは、プログラムを複数回実行すると異なる値になる可能性があります。あなたはこのようなもので、現在の時刻と乱数発生器を初期化することができます

rand.Seed(time.Now().UnixNano()) 

も使用することができcrypto/randと呼ばれる別のパッケージがあります(そのためにtimeパッケージをインポートすることを忘れないでください)より良い乱数値を生成することができます(このジェネレータは、ユーザーのマウスの動き、プロセッサの現在の発熱、および他の多くの要因も考慮に入れます)。しかし、このパッケージの機能は数倍遅く、パスフレーズジェネレータ(または他のセキュリティ関連のもの)を書かない限り、通常のrandパッケージはおそらく大丈夫です。

+2

プレーンランドのもう1つの有用な特性は、シードを再利用して結果を再現できることです。 –

+1

go1 time.Nanoseconds()が存在しないようです。あなたはrand.Seed(time.Now()。UnixNano())を使うことができます。 – Blacksad

1

最初にRNGを種まきする必要があります。

私は行くを使用したことがありませんが、それはおそらくrand.Seed(x);

+0

この、主パッケージ インポート "FMT" インポート "ランド" FUNCメイン(){ rand.Seed(100)を意味します。 \t fmt.Println(rand.Int31n(100)) }。また、同じ出力をすべて実行しています。 – Arpssss

+0

これは、静的な数値100でそれを播種しているからです:-)現在の時間(ミリ秒)など、よりユニークなものを使用してみてください。 –

0

rand.Seed(time.Now().UnixNano())はUbuntuで動作します。私は永遠にrand.Seed(time.Nanoseconds())を研究するのに費やしました。私は最終的にgolangツアーの例題:Google検索2.1を見つけました。