(Ruby)彩票号码,没有重复

时间:2015-01-10 00:39:03

标签: ruby

我的任务是创建一个抽奖程序,从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给了我一个错误,但我不知道如何以另一种方式做到这一点。

我希望有人能够为我提供一些代码,方法,解决方案或提示,以提前完成此任务。

4 个答案:

答案 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)
相关问题