如何在两个浮点数之间的范围内最好地创建随机浮点数

时间:2009-11-10 22:25:31

标签: ruby

我知道我可以使用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

谢谢!

4 个答案:

答案 0 :(得分:79)

将一系列浮点数传递给rand

如果你想在两个浮点数"之间创建一个随机浮点数,只需将一系列浮点数传递给rand

rand(11.2...76.9)

(使用Ruby 2.1测试)

答案 1 :(得分:47)

让我们回顾一下:

  

rand()将生成一个(伪) - 随机   漂浮在0和1之间。

     

rand(int)将生成一个   (psuedo-)0和0之间的随机整数   中间体

类似于:

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

看起来很好。

答案 2 :(得分:12)

在1.9和2.0中,您可以为rand提供范围参数:

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

答案 3 :(得分: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之间的随机浮点数。