2017-02-07 6 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 не тестирует равенство между экземплярами 'Random', но между поплавками. A (маленький) шаг отсутствует в вашем объяснении IMHO. –

+0

@ EricDulusil: Равенство заключалось в том, чтобы указать, что они имеют одно и то же состояние, поэтому, конечно, они будут создавать одинаковые случайные числа. ('a == b' для' a.is_a? Random' подразумевает 'a.rand == b.rand'.) – Ryan

+0

Это может быть очевидно для вас, но не для OP или для всех, кто придет, чтобы прочитать ваш ответ. Мне нужно было посмотреть «random.c», чтобы проверить, как определено равенство «Случайное». Мой 2c $. –