루비에서 난수를 얻는 방법


답변:


952

사용하다 rand(range)

에서 루비 임의의 번호 :

6면 주사위의 롤을 시뮬레이션하기 위해 임의의 정수가 필요한 경우 다음을 사용하십시오 1 + rand(6). 크랩 롤은로 시뮬레이션 할 수 있습니다 2 + rand(6) + rand(6).

마지막으로 임의의 부동 소수점이 필요한 경우 rand인수없이 호출 하면됩니다.


으로 마크 - 앙드레 Lafortune는 에 언급 (그것을 upvote에 가서) 아래에 그의 대답 , 루비 1.9.2 자체가 Random클래스 (마크 - 앙드레 자신이 있다는 디버그에 도움 , 따라서 1.9.2 대상 해당 기능을).

예를 들어, 10 개의 숫자를 추측해야하는게임에서 다음을 사용하여 숫자 를 초기화 할 수 있습니다.

10.times.map{ 20 + Random.rand(11) } 
#=> [26, 26, 22, 20, 30, 26, 23, 23, 25, 22]

노트 :

의 상응하는 이유입니다 Random.new.rand(20..30)20 + Random.rand(11)때문에, Random.rand(int)반환 "이 아닌 임의의 정수 크거나 제로에 동일 적은 인수보다 ." 20..3030을 포함하면 11을 제외하고 0에서 11 사이의 임의의 숫자가 필요합니다.


2
이건 정말 비 루비가 아닌가? 나는 모든 것이 가장 놀랍고 놀라운 것이라고 생각했습니다.
Dan Rosenstark

1
@ yar : 그것은 조금 "perlish"입니다. 이제 Ruby에는 Random 클래스가 있습니다 (제 답변 참조)
Marc-André Lafortune

3
@VonC : 새 Random클래스 를 언급하기 위해 답변을 편집 한 것이 좋지만, Random.new예와 같이 여러 번 호출하는 것은 끔찍한 아이디어 입니다. 그 대답을 편집했습니다.
Marc-André Lafortune

2
@VonC 아 :) 내가 조금 가혹한 경우 미안, 그냥 나를 놀라게했다
horseyguy

1
Random.rand 않습니다 실제로 범위를 받아들입니다. (1.9.3부터 믿습니다.)
Ajedi32

591

와 10 rand(42-10) + 10사이의 임의의 숫자를 얻는 데 사용할 수 있지만 (10은 42와 독점은 42) 루비 1.9.3 이후에는 더 나은 방법으로 전화를 걸 수 있습니다.1042

rand(10...42) # => 13

backportsgem 을 요구하여 모든 버전의 Ruby에서 사용할 수 있습니다.

Ruby 1.9.2는 Random클래스를 도입 하여 자신 만의 난수 생성기 객체를 생성하고 멋진 API를 제공합니다.

r = Random.new
r.rand(10...42) # => 22
r.bytes(3) # => "rnd"

Random직접 호출 할 수 있도록 클래스 자체는, 임의의 발전기 역할을합니다 :

Random.rand(10...42) # => same as rand(10...42)

에 대한 참고 사항 Random.new

대부분의 경우 가장 간단한 방법은 rand또는 을 사용하는 것 Random.rand입니다. 난수를 원할 때마다 새로운 난수 생성기를 생성하는 것은 정말 나쁜 생각 입니다. 이 작업을 수행하면 임의 생성기 자체 의 속성과 비교할 수있는 초기 시딩 알고리즘의 임의 속성을 얻게 됩니다 .

Random.new따라서 사용하는 경우 가급적 드물게 ( 예 : 한 번만 호출) MyApp::Random = Random.new다른 곳에서 사용해야합니다.

사례 Random.new유용는 다음과 같다 :

  • 당신은 보석을 쓰고 있고 주 프로그램이 의존하고있는 rand/ 시퀀스를 방해하고 싶지 않습니다 Random.rand.
  • 당신은 임의의 재현 가능한 난수 시퀀스를 원합니다 (예 : 스레드 당 하나)
  • 재현 가능한 난수 시퀀스를 저장하고 재개 할 수 있기를 원합니다 ( Random객체가 마샬링 될 수 있으므로 쉬움 )

1
우수한! +1. 그 새로운 기능을 반영하기 위해 내 답변을 완성했습니다 (그리고 버그 # 3104;
VonC

1
@yar : 내 backportsgem은 단순히 RUby 1.8.7, 1.9.1, 1.9.2에 새로 도입되었지만 Ruby로 구현 된 메소드 모음입니다. RubySpec을 사용하여 결과가 Ruby와 호환되는지 확인합니다.
Marc-André Lafortune

@ Marc-André Lafortune 감사합니다. 속도 요구 사항으로 인해 루비가 아닌 (C 또는 기타) 루비가 얼마나 많이 구현되는지는 항상 이상합니다. 그러나 그들은 휴식이다
Dan Rosenstark

5
Random.rand(10..42)작동하지 않습니다. Random.rand클래스 메소드는 범위를 허용하지 않습니다. (Ruby 1.9.2p180)
horseyguy 2016 년

1
@banister : 와우, 새로운 API (범위, 바이트 등의 랜드)가 Random 객체를 통해 직접 사용할 수 있다고 확신했습니다. 범위가있는 rand는 1.9.3에있을 것이고 바이트에 대한 기능 요청을 할 것입니다. 내 답변을 편집했습니다
Marc-André Lafortune

46

숫자뿐만 아니라 16 진수 또는 uuid를 찾고 있다면 SecureRandom모듈 ActiveSupport이 1.9.2 이상에서 루비 코어로 길을 찾았다는 것을 언급 할 가치가 있습니다. 따라서 완전한 프레임 워크가 필요하지 않습니다.

require 'securerandom'

p SecureRandom.random_number(100) #=> 15
p SecureRandom.random_number(100) #=> 88

p SecureRandom.random_number #=> 0.596506046187744
p SecureRandom.random_number #=> 0.350621695741409

p SecureRandom.hex #=> "eb693ec8252cd630102fd0d0fb7c3485"

여기에 문서화되어 있습니다 : Ruby 1.9.3-모듈 : SecureRandom (lib / securerandom.rb)


4 자리의 난수가 필요한 경우는 어떻습니까?
onurozgurozkan

1
onurozgurozkan 내가 추정SecureRandom.random_number(1000..9999)
JayTarka

1
SecureRandom.random_number()범위를 가지지 않으므로 아닙니다. 아마도 SecureRandom.random_number(10_000)(0-9999의 경우) 또는 SecureRandom.random_number(9_000)+1_000(1000-9999의 경우) 와 같은 것을 원할 것입니다 .
mwp

1
Random.rand (1000..9999)
Jesse Farmer

37

rand방법 으로 난수를 생성 할 수 있습니다 . rand메소드에 전달 된 인수는 integera 또는 a 이어야하며 range범위 내의 해당 난수를 리턴합니다.

rand(9)       # this generates a number between 0 to 8
rand(0 .. 9)  # this generates a number between 0 to 9
rand(1 .. 50) # this generates a number between 1 to 50
#rand(m .. n) # m is the start of the number range, n is the end of number range

나는 당신의 rand(1..6)독서를 최고 답보다 명확하게 사용한다고 생각합니다 rand(6)+1.
동 형사상

21

글쎄, 나는 알아 냈다. rand라는 내장 (?) 함수가 있습니다.

rand(n + 1)

누군가가 더 자세한 답변으로 대답하면 정답으로 표시합니다.


2
예, 커널 모듈에 내장되어 있습니다.
Christoph Schiessl

17

이건 어때?

n = 3
(0..n).to_a.sample

3
이 솔루션이 제공하는 것과 같은 숫자 배열을 생성하면 O (n) 동안 randO (1) 이므로 넓은 범위에서 끔찍한 성능을 나타 냅니다.
트래비스


9

간단하게 사용할 수 있습니다 random_number.

양의 정수가 n으로 지정 random_number되면 정수를 반환합니다. 0 <= random_number<n.

다음과 같이 사용하십시오.

any_number = SecureRandom.random_number(100) 

출력은 0에서 100 사이의 숫자입니다.


6
rand(6)    #=> gives a random number between 0 and 6 inclusively 
rand(1..6) #=> gives a random number between 1 and 6 inclusively

range 옵션은 루비의 최신 버전 (1.9 이상)에서만 사용할 수 있습니다.


범위 옵션은에서만 사용할 수 있다고 생각합니다 ruby 1.9.3+. 1.9.2적어도 시도했을 때 작동하지 않았습니다 .
Batkins

6

범위 = 10..50

랜드 (범위)

또는

range.to_a.sample

또는

range.to_a.shuffle (전체 배열을 습니다. 처음 또는 마지막 또는이 배열에서 임의의 숫자를 선택하여 임의의 숫자를 선택할 수 있습니다)


range.to_a.sample샘플이 클 때 끔찍한 아이디어입니다.
Grzegorz


4

이 링크는 이와 관련하여 도움이 될 것입니다.

http://ruby-doc.org/core-1.9.3/Random.html

그리고 루비의 난수보다 더 명확합니다.

0에서 10까지의 정수 생성

puts (rand() * 10).to_i

더 읽기 쉬운 방식으로 0에서 10까지의 숫자 생성

puts rand(10)

15를 포함하여 10에서 15까지의 숫자 생성

puts rand(10..15)

비 랜덤 난수

프로그램이 실행될 때마다 같은 숫자의 시퀀스를 생성

srand(5)

10 개의 난수 생성

puts (0..10).map{rand(0..10)}

또한 루비에서 임의의 nos에 대한 매우 명확한 그림을 단계별로이 블로그를 따라갈 수 있습니다. sitepoint.com/tour-random-ruby
Sam

4

루비에서 난수를 얻는 쉬운 방법은

def random    
  (1..10).to_a.sample.to_s
end

2

아마 당신을 도울 것입니다. 내 앱에서 이것을 사용합니다.

https://github.com/rubyworks/facets
class String

  # Create a random String of given length, using given character set
  #
  # Character set is an Array which can contain Ranges, Arrays, Characters
  #
  # Examples
  #
  #     String.random
  #     => "D9DxFIaqR3dr8Ct1AfmFxHxqGsmA4Oz3"
  #
  #     String.random(10)
  #     => "t8BIna341S"
  #
  #     String.random(10, ['a'..'z'])
  #     => "nstpvixfri"
  #
  #     String.random(10, ['0'..'9'] )
  #     => "0982541042"
  #
  #     String.random(10, ['0'..'9','A'..'F'] )
  #     => "3EBF48AD3D"
  #
  #     BASE64_CHAR_SET =  ["A".."Z", "a".."z", "0".."9", '_', '-']
  #     String.random(10, BASE64_CHAR_SET)
  #     => "xM_1t3qcNn"
  #
  #     SPECIAL_CHARS = ["!", "@", "#", "$", "%", "^", "&", "*", "(", ")", "-", "_", "=", "+", "|", "/", "?", ".", ",", ";", ":", "~", "`", "[", "]", "{", "}", "<", ">"]
  #     BASE91_CHAR_SET =  ["A".."Z", "a".."z", "0".."9", SPECIAL_CHARS]
  #     String.random(10, BASE91_CHAR_SET)
  #      => "S(Z]z,J{v;"
  #
  # CREDIT: Tilo Sloboda
  #
  # SEE: https://gist.github.com/tilo/3ee8d94871d30416feba
  #
  # TODO: Move to random.rb in standard library?

  def self.random(len=32, character_set = ["A".."Z", "a".."z", "0".."9"])
    chars = character_set.map{|x| x.is_a?(Range) ? x.to_a : x }.flatten
    Array.new(len){ chars.sample }.join
  end

end

https://github.com/rubyworks/facets/blob/5569b03b4c6fd25897444a266ffe25872284be2b/lib/core/facets/string/random.rb

그것은 나를 위해 잘 작동



1

시도 array#shuffle무작위위한 방법을

array = (1..10).to_a
array.shuffle.first

1
당신이 경우 합니다 전체 배열을, 적어도 교체 .shuffle.first와 함께 .sample!
Camille Goudeseune

0

먼저 srand ()로 RNG를 시드하는 것을 잊지 마십시오 .


2
srand ()를 호출하지 않으면 어떻게됩니까?
Alex B

21
srand는 시드가 아직 호출되지 않은 경우 현재 시간부터 시드와 함께 자동으로 호출됩니다.
Julian H
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.