(Ruby) 开奖号码,无重复

(Ruby) Lottery Numbers, without duplicates

我接到了创建一个彩票程序的任务,该程序输出从 1 到 49 的 6 个随机数,且不重复。我不允许使用数组的 shuffle-Method 并且作为提示我收到了我应该创建一个包含 49 个条目和 "shuffle" 个数字的数组。我考虑过这个提示,但它并没有真正帮助。

这就是我到目前为止所得到的,我希望有人能理解我的代码。与 ruby.

相比,我仍然坚持 Java 的写作方式
# 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 给我一个错误,但我不知道如何用另一种方式来做。

我希望有人能够为我提供一些代码片段、方法、解决方案或提示,在此先感谢。

查尔斯,我认为最简单的方法如下:

Array.new(49) { |x| x + 1 }.sample(6)

但是我相信这是你被禁止做的事情?如果是,请尝试更多 "manual" 解决方案:

Array.new(49) { |x| x + 1 }.sort { rand() - 0.5 }.take(6)

否则,请尝试实施一个完整的 "manual" 解决方案。例如:

require 'set'

result = Set.new

loop do
  result << 1 + rand(49)
  break if result.size == 6
end

puts result.to_a.inspect

这是我会采取的策略:

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(" ")

Ruby 爱好者倾向于使用 [] 初始化数组,而不是冗长的 Array.new

这是一种您不能使用的方法 sample:

a = *1..49
  #=> [1, 2, 3,..., 49] 
6.times.map { a.delete_at(rand(a.size))+1 }
  # => [44, 41, 15, 19, 46, 17]
min_lottery_number = 1 
max_lottery_number = 49 
total_size = 6 

(min_lottery_number..max_lottery_number).to_a.sample(total_size)