【问题标题】:How to best create a random float in a range between two floats如何在两个浮点数之间的范围内最好地创建一个随机浮点数
【发布时间】:2009-11-10 22:25:30
【问题描述】:

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

谢谢!

【问题讨论】:

  • 如果以下答案不可接受,请您澄清问题?
  • 感谢大家的回答,干净又好解释
  • @sandor_bedo 的答案可能是最好的:rand(-34.0..53.8)

标签: ruby


【解决方案1】:

将一系列浮点数传递给rand

如果你想“在两个浮点数之间的范围内创建一个随机浮点数”,只需将一个浮点数范围传递给rand

rand(11.2...76.9)

(使用 Ruby 2.1 测试)

编辑

根据文档:https://ruby-doc.org/core-2.4.0/Random.html

随机函数有两种不同的写法:包含和排除最后一个值

rand(5..9)      # => one of [5, 6, 7, 8, 9]
rand(5...9)     # => one of [5, 6, 7, 8]
rand(5.0..9.0)  # => between 5.0 and 9.0, including 9.0
rand(5.0...9.0) # => between 5.0 and 9.0, excluding 9.0

【讨论】:

  • 这是正确答案。具体来说,来自 ruby​​ 文档:“当 [给定] Range 时,rand 返回一个随机数,其中 range.member?(number) == true”。
【解决方案2】:

让我们回顾一下:

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

rand(int) 将生成一个 (伪)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

看起来不错。

【讨论】:

  • 正在寻找一种在 JRuby 中实现 Ruby 1.9.3 的随机范围的方法。这很好用!
【解决方案3】:

在 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

【讨论】:

  • 这是更好的答案。
【解决方案4】:

我认为你最好的办法是使用 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 之间的随机浮点数。

【讨论】:

    猜你喜欢
    • 2021-09-17
    • 2011-07-14
    • 2011-08-30
    • 2016-09-25
    • 1970-01-01
    • 1970-01-01
    • 2014-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多