2017-02-07 4 views
10

私は確定的にランダムなものを選ぶことについての巧妙になろうとしており、この発見された。第二のためになぜRubyではランダムがうまくいくのですか?

irb(main):011:0> Random.new(Random.new(1).rand + 1).rand == Random.new(1).rand 
=> true 
irb(main):012:0> Random.new(Random.new(5).rand + 1).rand == Random.new(5).rand 
=> false 
irb(main):013:0> Random.new(Random.new(5).rand + 5).rand == Random.new(5).rand 
=> true 

を、私は「すごい、多分それは、乱数発生器の財産だ」と思ったが、PythonとC#はに失敗しますそれを再現する。

答えて

11

あなたはおそらくこれに失望します。さんはrandの出力を見てみましょう:

irb(main):001:0> Random.rand 
0.5739704645347423 

それは[0、1)の範囲内の数です。 Random.newの整数の種を受け入れます。

irb(main):002:0> Random.new(5.5) == Random.new(5) 
true 

謎解き!

+0

OPは、「ランダム」インスタンス間の平等をテストするのではなく、浮動小数点の間でテストすることに注意してください。あなたの説明IMHOに(小さな)ステップがありません。 –

+0

@ EricDuminil:等価は同じ状態であることを指摘していたので、もちろん同じ乱数を生成します。 (a.is_a?Randomの 'a == b'は' a.rand == b.rand'を意味します。) – Ryan

+0

あなたには分かりますが、OPやあなたの答えを読んでくる皆には分かりません。私は 'random.c'を見て、' Random'平等がどのように定義されているかを調べなければなりませんでした。私の2c $。 –

関連する問題