2009-11-10 76 views
31

我知道我可以用rand(max)来产生随机浮点数。我试图在一个范围内生成一个浮点数,这应该不难。但是例如rand(1.4512)返回0,因此rand不是用浮点数计算的。现在我尝试了一些小技巧,将其转换为整数,然后在我想要的范围内随机化一个拟合数字,然后将其计算回浮点数。如何最好地创建一个随机浮点数在两个浮点数之间的范围内

我的问题是如何以更好的方式做到这一点。如果没有更好的办法,为什么这个不工作? (也许这对我来说太迟了,我应该在2个小时前开始睡觉..)。整个事情的目标是成为计算数据库记录的“位置”字段的方法,以便用户可以手动订购它们。我从来没有做过这样的事情,也许有人可以用更好的解决方案来暗示我。

这里是到目前为止的代码:

def calculate_position(@elements, index) 
    min = @elements[index].position 

    if @elements[index + 1].nil? 
     pos = min + 1 
    else 
     pos = min + (rand(@elements[index + 1].position * 10000000000)/10000000000) 
    end 

    return pos 
end 

谢谢!

+0

如果下面的答案是不可接受的,请你澄清这个问题? – Josh 2009-11-11 04:47:53

+0

谢谢大家对他们的回答,干净和很好的解释 – pduersteler 2009-11-11 06:55:54

+0

@ sandor_bedo的答案可能是这里最好的:'rand(-34.0..53。8)' – Automatico 2014-02-20 15:21:17

回答

38

让我们回顾一下:

兰特()将产生一个(psuedo-)无规 浮子0和1

兰特(INT)之间将生成之间的 (psuedo-)随机整数0和 int。

因此,像:

def range (min, max) 
    rand * (max-min) + min 
end 

应该管用。

更新:

一个小单元测试只是测试:

def testRange 
    min = 1 
    max = 100 

    1_000_000.times { 
     result = range min, max 
     print "ERROR" if result < min || result > max 
    } 
end 

看起来不错。

+0

正在寻找一种在JRuby中实现Ruby 1.9.3随机范围的方法。这很好用! – KChaloux 2012-06-30 03:13:00

3

我认为最好的方法是使用RAND()来生成0和1之间的随机浮动,然后乘以设定的范围内,并加入到设置偏移:

def float_rand(start_num, end_num=0) 
    width = end_num-start_num 
    return (rand*width)+start_num 
end 

注意:由于条件顺序无关紧要,使得end_num默认为0允许您使用float_rand(x)获得0到x之间的随机数。

10

在1.9和2.0,你可以给一个范围参数兰德:

irb(main):001:0> 10.times { puts rand Math::E..Math::PI } 
3.0656267148715446 
2.7813979580609587 
2.7661725184200563 
2.9745784681934655 
2.852157154320737 
2.741063222095785 
2.992638029938756 
3.0713152547478866 
2.879739743508003 
2.7836491029737407 
=> 10 
+0

这是更好的答案。 – Automatico 2014-02-20 15:18:50

61

传递一个范围内浮动,以rand

如果你想“创造一个范围内的随机浮动两个浮体之间“,只是通过一系列的浮标rand

rand(11.2...76.9) 

(测试用Ruby 2.1)

+0

这是正确的答案。具体来说,从红宝石docs:“[给定]一个'Range','rand'返回一个随机数,其中'range.member?(number)== true'”。 – omnikron 2017-09-14 09:06:20

+0

这应该是公认的答案! – gregblass 2018-01-26 13:33:31