Ruby에서 a와 b 사이의 난수를 생성하는 방법은 무엇입니까?


189

예를 들어 3에서 10 사이의 난수를 생성하려면 다음을 사용하십시오. rand(8) + 3

이 작업을 수행하는 더 좋은 방법이 rand(3, 10)있습니까?


4
def my_rand(x, y); rand(y - x) + x; end
Theo

그런데 @Theo y - x + 1.
Nakilon

1
올바른 (10)에 대한 답변과 한계 등 10 ** 24을보십시오 : 0은 매우 매우 긴 :) awaitng 될 것입니다
사얀 Malakshinov

5
이 작품은 :rand(3..10)
eikes

답변:


324

업데이트 : Ruby 1.9.3 Kernel#rand은 범위를 허용합니다.

rand(a..b)

http://www.rubyinside.com/ruby-1-9-3-introduction-and-changes-5428.html

배열로 변환하는 것이 너무 비쌀 수 있으며 불필요합니다.


(a..b).to_a.sample

또는

[*a..b].sample

배열 # 샘플

Ruby 1.8.7+의 표준.
참고 : 1.8.7에서는 이름이 #choice이고 이후 버전에서는 이름이 변경되었습니다.

그러나 어쨌든 어레이를 생성하려면 리소스가 필요하며 이미 작성한 솔루션이 최선입니다.


감사! 나는 오래되고 좋은 방법으로 머물 것이라고 생각합니다 :)
Misha Moroshko

32
이것은 특히 나쁜 생각입니다. 특히 a와 b의 크기가 알 수없는 경우. (100000000000000000..100000000000000) .to_a.sample을 시도하고 무슨 뜻인지 확인하십시오
:)

4
@pixelearth, 질문에 맞는 더 나은 아이디어가 있다면 게시 할 수 있습니다.
Nakilon

rand(a..b)작동하지 않으면 분할 TypeError: can't convert Range into Integer됩니다.. 루비 2.0
fguillen

2
@ fguillen 1.9.3에서 작동하지만 왜 작동하지 않는지 모르겠습니다.
Michael Dorst

87
Random.new.rand(a..b) 

a가장 낮은 가치는 어디에 b있고 가장 높은 가치는 어디에 있습니까 ?


4
참고로 중요한 차이점은 바로 호출하는 경우이다 rand()당신이 호출 Kernel#rand만 지원하는, max인수를. 범위를 전달하려면을 사용해야합니다 Random#rand. 즉,이 방법을 구현해야합니다. +1
grumpit

2
위의 내용은 1.9.2에 적용됨
grumpit

a와 b를 포함합니까?
Abhradip



3

참조 대답 : 이전 버전이 루비 1.9.2에 있지만. 개인적으로 나는 rand (8) + 3이 괜찮다고 생각하지만, 관심이 있다면 링크에 설명 된 Random 클래스를 확인하십시오.




2

그리고 여기에 모두 빠른 벤치 마크 #sample와는 #rand:

irb(main):014:0* Benchmark.bm do |x|
irb(main):015:1*   x.report('sample') { 1_000_000.times { (1..100).to_a.sample } }
irb(main):016:1>   x.report('rand') { 1_000_000.times { rand(1..100) } }
irb(main):017:1> end
       user     system      total        real
sample  3.870000   0.020000   3.890000 (  3.888147)
rand  0.150000   0.000000   0.150000 (  0.153557)

따라서 rand(a..b)옳은 일을하는 것이

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.