从具有 n 个随机数的随机数组和 return 数组中删除数字?
Delete number from random array and return array with n random numbers?
我想在 Ruby 中制作一个方法,其中 returns 一个数组中的随机数并制作了这个:
@nr = 1..60
def ar_one
ar = @nr.to_a.shuffle
ar.pop
end
但我不止一次得到数字,而且数组永远不会为零。
这有什么问题吗?
而且我需要一个方法给我 n*random_numbers_from_array。
因此,如果我说 n=3 比我想要的要多: [12, 1, 59] 类似这样的东西,然后删除索引处的这 3 个数字。
我试过了,但我只在索引 n-1 处得到一个随机数,仅此而已。
def ar_all(n=3)
arr = []
@nr.each do |nr|
arr.insert(n-1,ar_one)
n += -1
return arr
end
end
如果有人能说出我在 arr_one
中犯了哪个错误以及如何在 arr_all
中获得所有 n 个随机数,那就太好了。
你可以通过简单易行的方式做到:
@array = [1,2,3,4,5,6,7,8,9]
def random_collector
number = @array.sample
index = @array.index(number)
@array.delete_at(index)
number
end
问题是每次 运行 ar_one
方法时,您实际上都会创建一个新数组。
ar = @nr.to_a.shuffle # <= here you create a new array and shuffle it
ar.pop # <= here you pop and return the first element of that new array
你的第二个例子失败了,因为你在 each
块的第一次迭代结束时从那个方法 return 收集了一个元素:
@nr.each do |nr|
arr.insert(n-1,ar_one)
n += -1
return arr #<= here you return from that method without checking `n`
end
我会这样做:
class Sampler
def initialize(number = 60)
@array = (1..number).to_a.shuffle
end
def one
@array.pop
end
def many(number)
@array.pop(number)
end
end
sampler = Sampler.new(4)
sampler.one
#=> 2
sampler.many(3)
#=> [3, 1, 4]
我建议:
def random_collector
@array.delete_at(rand(@array.size))
end
如果@array
不修改,就复制一份操作
我想在 Ruby 中制作一个方法,其中 returns 一个数组中的随机数并制作了这个:
@nr = 1..60
def ar_one
ar = @nr.to_a.shuffle
ar.pop
end
但我不止一次得到数字,而且数组永远不会为零。 这有什么问题吗?
而且我需要一个方法给我 n*random_numbers_from_array。 因此,如果我说 n=3 比我想要的要多: [12, 1, 59] 类似这样的东西,然后删除索引处的这 3 个数字。 我试过了,但我只在索引 n-1 处得到一个随机数,仅此而已。
def ar_all(n=3)
arr = []
@nr.each do |nr|
arr.insert(n-1,ar_one)
n += -1
return arr
end
end
如果有人能说出我在 arr_one
中犯了哪个错误以及如何在 arr_all
中获得所有 n 个随机数,那就太好了。
你可以通过简单易行的方式做到:
@array = [1,2,3,4,5,6,7,8,9]
def random_collector
number = @array.sample
index = @array.index(number)
@array.delete_at(index)
number
end
问题是每次 运行 ar_one
方法时,您实际上都会创建一个新数组。
ar = @nr.to_a.shuffle # <= here you create a new array and shuffle it
ar.pop # <= here you pop and return the first element of that new array
你的第二个例子失败了,因为你在 each
块的第一次迭代结束时从那个方法 return 收集了一个元素:
@nr.each do |nr|
arr.insert(n-1,ar_one)
n += -1
return arr #<= here you return from that method without checking `n`
end
我会这样做:
class Sampler
def initialize(number = 60)
@array = (1..number).to_a.shuffle
end
def one
@array.pop
end
def many(number)
@array.pop(number)
end
end
sampler = Sampler.new(4)
sampler.one
#=> 2
sampler.many(3)
#=> [3, 1, 4]
我建议:
def random_collector
@array.delete_at(rand(@array.size))
end
如果@array
不修改,就复制一份操作