我的任务是创建一个抽奖程序,从1到49输出6个随机数,没有重复。我不允许使用shuffle-Method of Arrays,作为一个提示,我收到了我应该创建一个包含49个条目的数组并“洗牌”数字。我想到了这个提示,但它并没有真正起作用。
这是我到现在为止所做的,希望有人理解我的代码。我仍然坚持使用Java而不是ruby。
# Generating the Array
l_num = Array.new(6)
i = 0
while (i == 0)
l_num << [rand(1...49), rand(1...49), rand(1...49), rand(1...49), rand(1...49), rand(1...49)]
if (l_num.uniq.length == l_num.length)
i += 1
end
end
#Output
puts 'Todays lottery numbers are'
l_num.each { |a| print a, " " }
我选择了uniq-Methode,因为我读到它可以通过这种方式实现双打,但我不认为它适用于这种情况。在我的代码的早期版本中,我得到了一个错误,因为我试图覆盖已经创建的数组,我理解为什么Ruby给了我一个错误,但我不知道如何以另一种方式做到这一点。
我希望有人能够为我提供一些代码,方法,解决方案或提示,以提前完成此任务。
答案 0 :(得分:4)
这是我要采取的策略:
lottery_numbers = []
begin
# add 1 because otherwise it gives you numbers from 0-48
number = rand(49)+1
lottery_numbers.push(number) unless lottery_numbers.include?(number)
end while lottery_numbers.size < 6
puts "lottery numbers:"
puts lottery_numbers.join(" ")
Rubyist倾向于使用[]
初始化数组,而不是使用详细Array.new
答案 1 :(得分:2)
查尔斯,我认为最简单的是:
Array.new(49) { |x| x + 1 }.sample(6)
然而,这是我认为你被禁止做的事情?如果是,请尝试更多&#34;手册&#34;溶液:
Array.new(49) { |x| x + 1 }.sort { rand() - 0.5 }.take(6)
否则,请尝试完全实施一个&#34;手册&#34;解。例如:
require 'set'
result = Set.new
loop do
result << 1 + rand(49)
break if result.size == 6
end
puts result.to_a.inspect
答案 2 :(得分:2)
这是一种方法,您无法使用sample
:
a = *1..49
#=> [1, 2, 3,..., 49]
6.times.map { a.delete_at(rand(a.size))+1 }
# => [44, 41, 15, 19, 46, 17]
答案 3 :(得分:0)
min_lottery_number = 1
max_lottery_number = 49
total_size = 6
(min_lottery_number..max_lottery_number).to_a.sample(total_size)