2017-02-07 2 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 

을, 나는 "와우, 어쩌면 그 난수 발생기의 속성이다"하지만, 파이썬과 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 $. –

관련 문제