2015-01-12 45 views
-1

你好我写(N)边的一个简单的芯片代码,它工作正常:实例VS类变量和随机数红宝石

class Die 

    def initialize(sides) 
    @sides = sides 
    raise ArgumentError if sides < 1 
    end 

    def roll 
    roll_number = rand(@sides) + 1 
    end 
end 

然而,当我在我的初始化的变量从实例更改上课随机数产生从整数到一堆小浮点数1左右。

class Die 

    def initialize(sides) 
    HERE --> @@sides = sides 
    raise ArgumentError if sides < 1 
    end 

    def roll 
    roll_number = rand(@sides) + 1 
    end 

end 

我想知道什么可能导致这种差异?

回答

0

您的代码存在错误,在您的第二个版本的Die中,您实际上从未在您的roll方法中调用正确的变量。

它应该是:

def roll 
    roll_number = rand(@@sides) + 1 
    end 

而是你正在评估到:

roll_number = rand(nil) + 1 

按照rand库,如果你不提供一个参数兰特返回一个伪随机浮点数在0.0和1.0之间,包括0.0和不包括1.0。

1

在第二个代码片段中,您正在初始化类变量@@sides,但仍将实例变量@sides传递到rand()。由于@sides未初始化,因此您将nil传递给rand()的调用,因此Kernel#rand会给出float而不是整数。