배열에서 무작위로 어떻게 선택합니까?


559

이 작업을 수행하는 훨씬 더 깨끗한 방법이 있는지 알고 싶습니다. 기본적으로 가변 길이 배열에서 임의의 요소를 선택하고 싶습니다. 일반적으로 다음과 같이합니다.

myArray = ["stuff", "widget", "ruby", "goodies", "java", "emerald", "etc" ]
item = myArray[rand(myarray.length)]

두 번째 줄을 대체하기가 더 읽기 쉽고 더 쉬운 것이 있습니까? 아니면 최선의 방법입니다. 나는 당신이 할 수 있다고 가정 myArray.shuffle.first하지만 #shuffle, 몇 분 전만 보았 으므로 실제로는 사용하지 않았습니다.


13
아래의 좋은 답변이지만 셔플에 대한 일반적인 사항. 전체 배열을 쓸어 넘기는 것이 임의의 숫자를 얻는 것보다 훨씬 집중적이므로 좋은 방향이 아닙니다.
Derek Organ

답변:


1127

그냥 사용하십시오 Array#sample:

[:foo, :bar].sample # => :foo, or :bar :-)

Ruby 1.9.1 이상에서 사용할 수 있습니다. 또한 이전 버전의 Ruby에서 사용할 수 있도록 할 수 require "backports/1.9.1/array/sample"있습니다.

Ruby 1.8.7에서는 불행한 이름으로 존재합니다 choice. 이후 버전에서는 이름이 바뀌 었으므로 사용해서는 안됩니다.

이 경우에는 유용하지 않지만 sample여러 개의 고유 한 샘플을 원하는 경우 숫자 인수를 허용합니다.


1
나는 당신이 나에게 완벽한 대답을 할 것이라는 것을 알고 있었을 것입니다 (여기서 탐색하는 대부분의 루비 질문은 어딘가에 입력이 있기 때문에). 버전 관리를 지적 해 주셔서 감사합니다. 1.9.2를 사용하고 있습니다. apidock (mladen의 의견)에는 샘플이 없습니다. 루비 독도 마찬가지입니다. 귀하의 의견으로는 Ruby에 가장 적합한 참조는 1.9로 업데이트 된 것입니까?
Paul Hoffer

참고로, 다른 답변을 처음 선택한 후에 "정답"을 변경하는 것이 적절합니까?
Paul Hoffer 1

1
감사합니다 :-) 그리고 네, 그것은 (참조 권장 meta.stackexchange.com/questions/19448/...를 )
마크 - 앙드레 Lafortune을

1.8.8에 대한 언급을 삭제 한 것으로 나타났습니다. 여전히 1.8 헤드로 제공되며 1.8.8이 발생하지 않기 때문에 질문을 편집하고 있습니까?
앤드류 그림

3
@Andrew : 그렇습니다. 1.8.8이 발생하지 않기 때문에 답을 편집했습니다. 그것은 여전히 ​​1.8 헤드에 있어야하지만 그 지점은 죽었습니다 :-(
Marc-André Lafortune

84

myArray.sample(x) 또한 배열에서 x 임의의 요소를 얻는 데 도움이 될 수 있습니다.


6
my_array.sample (1)! = my_array.sample
Redithion

5
@Redithion 또한 주목할 가치가 있습니다. my_array.sample (1) == [sample]과 my_array.sample == sample은 의미를 명확하게 제공합니다.
Ekkstein


12

배열에서 난수의 난수

def random_items(array)
  array.sample(1 + rand(array.count))
end

가능한 결과의 예 :

my_array = ["one", "two", "three"]
my_array.sample(1 + rand(my_array.count))

=> ["two", "three"]
=> ["one", "three", "two"]
=> ["two"]

@fwilson 임의 순서의 객체 모음. 또한 다른 조합을 테스트하거나 스터브 데이터를 생성하는 데에도 좋습니다
Mike Rapadas

왜 클래스 Array를 확장하지 않습니까? [] .total_random은 훨씬 더 시원합니다. 루비가 온다. 그 목표!
Tim Kretschmer 2016 년

이것은 빈 배열을 반환하지 않습니다. 1 +다른 장소 에 배치해야합니다 .
사와

0
arr = [1,9,5,2,4,9,5,8,7,9,0,8,2,7,5,8,0,2,9]
arr[rand(arr.count)]

이것은 배열에서 임의의 요소를 반환합니다.

아래 언급 된 줄을 사용한다면

arr[1+rand(arr.count)]

어떤 경우에는 0 또는 nil 값을 반환합니다.

아래 언급 된 줄

rand(number)

항상 0에서 1까지의 값을 반환하십시오.

우리가 사용한다면

1+rand(number)

그러면 숫자를 반환하고 arr [number]에는 요소가 없습니다.


-2
class String

  def black
    return "\e[30m#{self}\e[0m"
  end

  def red
    return "\e[31m#{self}\e[0m"
  end

  def light_green
    return "\e[32m#{self}\e[0m"
  end

  def purple
    return "\e[35m#{self}\e[0m"
  end

  def blue_dark
    return "\e[34m#{self}\e[0m"
  end

  def blue_light
    return "\e[36m#{self}\e[0m"
  end

  def white
    return "\e[37m#{self}\e[0m"
  end


  def randColor
    array_color = [
      "\e[30m#{self}\e[0m",
      "\e[31m#{self}\e[0m",
      "\e[32m#{self}\e[0m",
      "\e[35m#{self}\e[0m",
      "\e[34m#{self}\e[0m",
      "\e[36m#{self}\e[0m",
      "\e[37m#{self}\e[0m" ]

      return array_color[rand(0..array_color.size)]
  end


end
puts "black".black
puts "red".red
puts "light_green".light_green
puts "purple".purple
puts "dark blue".blue_dark
puts "light blue".blue_light
puts "white".white
puts "random color".randColor
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.