1

我是一名 Ruby 初学者,正在尝试将多个类别添加到我的刽子手游戏中。

我知道如何从数组中选择一个随机元素。例如:

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

但这会放置一个完整的数组,而不是一个元素。请帮忙!谢谢

4

6 回答 6

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(a splat) 总是返回一个字符串。

于 2013-08-03T16:31:44.620 回答
1

您的代码是正确的,但数组初始化不正确。这是你必须做的:

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

categories = [animals, planets, fruits]

在您的代码中,animals是数组,planets并且fruits是数组的数组,并且categories是三个数组的数组,每个数组的内部都是其中一个变量

于 2013-08-03T16:22:13.210 回答
0

这应该是最短和最干净的方法。

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

[animals, planets, fruits].flatten.sample

#flatten返回一个包含所有元素但只有一维的新数组。

#sample从您的数组中返回一个随机元素

于 2013-08-03T20:32:21.937 回答
0

你所拥有的应该工作,这是你的categories阵列不工作。它应该是:

categories =[animals, planets, fruits]

而不是数组中的数组混合。

于 2013-08-03T16:25:05.683 回答
0

为什么不将它们全部压平,或者那是矫枉过正

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

您也可以使用更高效的方法<<来连接数组。

于 2013-08-03T16:26:44.800 回答
0

使用Array#sample方法

于 2013-08-03T16:27:41.803 回答