2017-08-18 10 views
3

私はそれがすべての実行のためにrand.Intn(n int) intに同じ番号を印刷し、なぜわからgolangに新しくないよ:なぜgolangは同じ乱数を繰り返すのですか?

package main 

import (
    "fmt" 
    "math/rand" 
) 


func main() { 
    fmt.Println(rand.Intn(10)) 
} 

ドキュメントは言う:

INTNは、intとして、非を返します。デフォルトのSourceからの[0、n]の負の疑似乱数です。 n < = 0の場合はパニックになります。

乱数生成を正しくシードするにはどうすればよいですか?

答えて

5

rand.Seed()関数を呼び出して、(ランダムな)シード(通常は現在のunixタイムスタンプ)を渡します。 math/randから引用してください。doc:

Float64やIntなどのトップレベル関数は、プログラムが実行されるたびに決定的な値のシーケンスを生成するデフォルトの共有ソースを使用します。実行ごとに異なる動作が必要な場合は、Seed関数を使用してデフォルトのSourceを初期化します。

例:rand.Seed()が呼び出されていない場合は1で接種したかのよう

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

、発電機の動作:

種子は、決定論的に、デフォルトのソースを初期化するために提供するシード値を使用しています状態。 Seedが呼び出されない場合、Seed(1)によってシードされたかのようにジェネレータは動作します。

+0

ありがとう@icza。だから、デフォルトの 'seed'はある定数ですか? –

+1

@mujaはい、1でシードされたようです。編集された答えをご覧ください。 – icza

1
package main 

import 

(
"fmt" 
"math/rand" 
"time" 
) 

func randomGen(min, max int) int { 
rand.Seed(time.Now().Unix()) 
return rand.Intn(max - min) + min 
} 

func main() { 
randNum := randomGen(1, 10) 
fmt.Println(randNum) 
} 
関連する問題