[英]Ruby method returns hash values in binary
我编写了一个方法,该方法使用六个名称,然后使用四个6边骰子生成七个随机数的数组。 丢弃四个6面骰子中的最低值,然后将其余的值相加以创建该值。 然后将该值添加到数组。
一旦生成了七个数字,则将数组从最高到最低排序,并删除最低值。 然后将名称数组和值数组压缩在一起以创建哈希。
此方法确保名称数组中的名字接收最高值,而名字接收最低值。
这是调用该方法的结果:
{:strength=>1, :dexterity=>1, :constitution=>0, :intelligence=>0, :wisdom=>0, :charisma=>1}
如您所见,我收到的所有值都是“ 1”或“ 0”。 我不知道这是怎么回事。
这是代码:
module PriorityStatGenerator
def self.roll_stats(first_stat, second_stat, third_stat, fourth_stat, fifth_stat, sixth_stat)
stats_priority = [first_stat, second_stat, third_stat, fourth_stat, fifth_stat, sixth_stat].map(&:to_sym)
roll_array = self.roll
return Hash[stats_priority.zip(roll_array)]
end
private
def self.roll
roll_array = []
7.times {
roll_array << Array.new(4).map{ 1 + rand(6) }.sort.drop(1).sum
}
roll_array.reverse.delete_at(6)
end
end
这是我在测试时调用方法的方式:
render plain: PriorityStatGenerator.roll_stats(params[:prioritize][:first_stat], params[:prioritize][:second_stat], params[:prioritize][:third_stat], params[:prioritize][:fourth_stat], params[:prioritize][:fifth_stat], params[:prioritize][:sixth_stat])
我在调用该方法require 'priority_stat_generator'
地方添加了require 'priority_stat_generator'
,因此它可以正确地调用它。
有人可以帮助我让它返回介于1到18之间的正确值吗?
您需要学习使用IRB或PRY来测试代码片段,或者更好的是,学习使用调试器。 它们使您洞悉代码的作用。
在IRB中:
[7,6,5,4,3,2,1].delete_at(6)
1
换句话说, delete_at(6)
正在执行应有的操作,但这不是您想要的。 相反,切片数组的行为可能更像您期望的那样:
>> [7,6,5,4,3,2,1][0..-2]
[
[0] 7,
[1] 6,
[2] 5,
[3] 4,
[4] 3,
[5] 2
]
另外,在您的代码中,当该操作是方法中的最后逻辑步骤时,不必return
值。 Ruby将返回最后看到的值:
Hash[stats_priority.zip(roll_array)]
这是一种简化操作,并使用实际上是随机数生成器的重构,因为rand
非常糟糕 :
require 'securerandom'
module PriorityStatGenerator
def self.roll_stats(*stats)
Hash[
stats.map(&:to_sym).zip(self.roll(stats.length).reverse)
]
end
private
def self.roll(n = 7)
(n + 1).times.map do
4.times.map { 1 + SecureRandom.random_number(6) }.sort.drop(1).inject(:+)
end.sort.last(n)
end
end
这利用了inject(:+)
因此可以在纯Ruby中工作,不需要ActiveSupport。
*stats
的使用使roll_stats
函数的方式更加灵活。 您的版本具有非常严格的参数数量,这令人困惑并且经常令人讨厌。 将参数视为数组可避免由于有六个参数而产生的许多约束。
需要说明的是,不清楚为什么要先创建N + 1个角色,然后放弃最后一个。 这与生成N且不丢弃任何N相同。 也许您打算对它们进行排序并获得N最佳?
更新:添加了sort
和reverse
以正确地映射优先级。
正如amadan所说,我看不到您是如何获得结果的,但是它们是代码中肯定的错误。
self.roll的最后一行是返回值。
roll_array.reverse.delete_at(6)
这将返回已删除的值。 您需要添加新行以返回roll_array而不是delete_at值。 您也不会在删除最后一个项目之前对数组进行排序,这也会给您错误的值。
def self.roll
roll_array = []
7.times {
roll_array << Array.new(4).map{ 1 + rand(6) }.sort.drop(1).sum
}
roll_array.sort.drop(1)
roll_array
end
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.