如果我按如下方式模拟六面模具的滚动,它总是评估为6.如何解决这个问题?
def rolldice()
roll = rand()
case roll
when 0..(1/6) then return 1
when (1/6)..(2/6) then return 2
when (2/6)..(3/6) then return 3
when (3/6)..(4/6) then return 4
when (4/6)..(5/6) then return 5
else return 6
end
end
die1 = rolldice()
puts die1
答案 0 :(得分:5)
这是因为1/6
是0
。您只需将范围传递给rand
:
def rolldice
rand(1..6)
end
答案 1 :(得分:1)
当你除以两个整数时,结果将是一个整数,所以你的代码实际上是这样做的:
when 0..0 then return 1
when 0..0 then return 2
when 0..0 then return 3
when 0..0 then return 4
when 0..0 then return 5
else return 6
在IRB中尝试这个简单的例子:
1 / 6
=> 0
答案 2 :(得分:1)
Stefan是对的,但答案并没有清楚地解释你的问题。
问题是rand()
给你一个Float(可以在小数点后面有数字)。
但是在case
声明中,您使用的是0..(1/6)
。
问题是(1/6)
中的数字都是整数,所以答案是整数。这就是为什么(1/6)
是0
,它是四舍五入的。
您也可以使用when
范围来解决问题,例如:
when (3.0/6)..(4.0/6) then return 4
查看(3.0/6)
我们有一个Float除以整数,结果是一个Float,在本例中为0.5
。
但最终可能最好遵循斯特凡的建议。我们可以使用范围,而不是将rand
用于从0
到1
的浮点数。一些选择:
rand(1..6) # Returns an Integer from 1 to 6
rand(6) # Returns an Integer from 0 to 5
如果您使用第一种情况,那么您可以将时间重写为when 5
...等等。在这种情况下,因为你想要的只是返回数字,你甚至不需要case
语句,因此Stefan更简单的回答是直接调用rand
并使用该值。
答案 3 :(得分:0)
案例声明不是您的最佳选择。它可能最适合文本或修复值。假设您正在进行RPG应用程序, Switch 可能更有用,可以选择如何处理武器/装甲。
Case 是一种更优雅的方式来编写很多if elses,但表现方式几乎相同。在编写 Case 之前,您应该使用irb(或rails控制台,如果您愿意)测试条件。这使事情变得更容易。
Case也做了很多比较,在这个特殊情况下它们没有必要,使用rand()直接表现会更好,代码也会更简单。请注意,rand(6)将从0返回到5,只是总和1以获得d6。
def rolldice
return rand(6)+1
end