2017-10-25 14 views
-1

私のJulia 0.5スクリプトでは、スクリプトを再実行するたびにrand()と同じ結果を得るためにsrand(1234)を使用します。しかし、私は別の結果を得る。何が悪いですか?srand()でシードを修正すると、rand()と異なる結果が出る

+1

詳細は必要とされています。おそらく 'srand'をリセットし、後で別の結果を示すコードです。いずれの場合でも、**グローバル** RNGを使用する関数は、取得するシーケンスを変更します。したがって、乱数の気付かれない使用を探します。 –

+0

関連コードを表示してください – Wndrr

答えて

0

@Dan Getzがこのコメントで述べたように、これはあなたが知らないうちにランダム関数を呼び出すコードがあるためです。

あなたは同じ種セットと同じrand()関数を呼び出す場合、期待どおり、あなたは同じ結果を得る:

julia> for i in 1:3 
      srand(1) 
      println(rand()) 
     end 
0.23603334566204692 
0.23603334566204692 
0.23603334566204692 

しかし、あなたはしてもしなくてもよいかもしれランドにスクリプト内の別のコールを持っている場合調査したrand()コールに行くと、乱数ジェネレータはさまざまな段階にあります。ループの2回目の反復で異なる値の乱数発生器と結果をオフセットし、余分なrand()コールがありますか

julia> for i in 1:3 
      srand(1) 
      if i == 2 
       rand() 
      end 
      println(rand()) 
     end 
0.23603334566204692 
0.34651701419196046 
0.23603334566204692 

注意:ここではこれを説明するための例です。

+0

優秀な回答。問題が解決しました。私の「メイン」スクリプトでは、 – JdG

+0

が役に立つと思うなら、問題を解決したことを人々が理解できるように答えを受け入れます。 StackOverflowへようこそ! – niczky12

+0

私はstackoverflowのnewbyです。どのように「答えを受け入れる」のですか? – JdG

0

@ niczky12によって与えられた答えに加えて、あなた自身のジェネレータを定義し、より良い再現性のためにそのジェネレータを使用することをお勧めします。あなたのコントロール)は、あなたが得る乱数には影響しません。例えば

、シード1234のMersenneTwister作成:次に、あなたは、単にあなたのrand呼び出しに、この発電機を渡す

rng = MersenneTwister(1234) 

を:

julia> rng = MersenneTwister(1234); 

julia> rand(rng) 
0.5908446386657102 

julia> rand(rng, 2, 3) 
2×3 Array{Float64,2}: 
0.766797 0.460085 0.854147 
0.566237 0.794026 0.200586 
関連する問題