2013-08-03 5 views
1

저는 행맨 게임에 여러 카테고리를 추가하려고하는 루비 초보자입니다.임의의 배열에서 임의의 요소를 선택하려면 어떻게해야합니까?

배열에서 임의의 요소를 선택하는 방법을 알고 있습니다. 예를 들어,

animals = ['dog', 'cat', 'mouse'] 
random = animals[rand(animals.length)] 
puts random 

그러나 전체 배열을 임의로 선택한 다음 해당 무작위 배열의 단일 임의 요소를 선택하려고합니다. 예 :

animals = ['dog', 'cat', 'mouse'] 
planets = [['jupiter'], ['mars']] 
fruits = [['apple'], ['orange'], ['mango']] 

categories =[[animals], [planets], [fruits]] 

#the code I tried was: 
random_array = categories[rand(categories.length)] 
random_element = random_array[rand(random_array.length)] 
puts random_element 

그러나 이것은 하나의 요소 대신 전체 배열을 배치합니다. 도와주세요! 감사합니다.

+0

왜'planets'와'fruits' 배열이 아닌 문자열의 각 요소? 배열의 여분의 층 안에있는'categories'의 각 요소는 왜입니까? – sawa

+0

[배열에서 고유 한 임의의 번호 선택] (0120) 번 (0120) 번에 –

답변

1

코드가 맞지만 배열 초기화가 올바르지 않습니다. 여기에 당신이해야 할 작업은 다음과 같습니다 배열, planetsfruits은 배열의 배열은 animals은, 당신의 코드에서

animals = ['dog', 'cat', 'mouse'] 
planets = ['jupiter', 'mars'] 
fruits = ['apple', 'orange', 'mango'] 

categories = [animals, planets, fruits] 

, 그리고 categories는 각각의 내부에 세 개의 배열의 배열 당신 변수 중 하나입니다

0

당신이해야 할 일은, 귀하의 어레이가 작동하지 않는 것입니다. 그것은 있어야 :

categories =[animals, planets, fruits] 

아닌 배열에서 배열의 혼합을.

0

왜 그들 모두를 평평하게하거나 잔인한

a = (animals.flatten + fruits.flatten + planets.flatten) 
r = a[rand(a.flatten.size)] 
=> "dog" 

는 또한 배열을 연결하는 << 더 효율적으로 사용할 수 있다는 것입니다 없습니다.

+1

'(animals + fruits + 행성). 평평한 '은 동등하고 짧으며 가능성이 더 높습니다. –

+0

나는 [* animals, * fruits, * planets]와 같이 갈 것이다. – sawa

+0

@AndrewMarshall'<<'는 이전의 병합 호출에 의해 반환 된 배열에 추가 중입니다. '+'는 새로운 배열을 생성하고 모든 요소를 ​​그 안에 넣는 동안. 그래서 우리는'<<'(append)를 사용한 하나의 배열 대신에 2 개의 새로운 배열이 있습니다 – bsd

2
animals = ['dog', 'cat', 'mouse'] 
planets = [['jupiter'], ['mars']] 
fruits = [['apple'], ['orange'], ['mango']] 

categories = [animals, planets, fruits] 
puts categories.sample.sample #=> jupiter 

Sawa의 말처럼, 이것은 문자열 또는 하위 배열 중 하나를 반환합니다. *categories.sample.sample (스 플랫)은 항상 문자열을 반환합니다.

+0

+1은 훨씬 간단하게'sample'을 사용합니다. –

+1

''목성 ''이 아니라'[ "jupiter"]'를 얻을 수 있습니다. – sawa

+0

@sawa 아, 그렇습니다.하지만'puts '때문에 보여주지는 않습니다. – steenslag

0

이 방법은 가장 짧고 깨끗한 방법입니다.

animals = ['dog', 'cat', 'mouse'] 
planets = [['jupiter'], ['mars']] 
fruits = [['apple'], ['orange'], ['mango']] 

[animals, planets, fruits].flatten.sample 

#flatten은 모든 요소가 하나의 차원에 불과한 새 배열을 반환합니다.

#sample 돌아갑니다 배열에서 하나 개의 랜덤 요소

관련 문제