(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)
我接到了创建一个彩票程序的任务,该程序输出从 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)