【问题标题】:How do you generate a random number between [1, n] using a random generator that generates a floating point number between [0.0, 1.0)如何使用随机生成器生成 [1, n] 之间的随机数,该随机生成器生成 [0.0, 1.0) 之间的浮点数
【发布时间】:2011-11-01 15:58:13
【问题描述】:

假设你有一个随机数生成器,它生成一个介于 [0.0, 1.0) 之间的随机浮点数,例如drand48,你怎么能创建一个生成一个介于 [1, n] 之间的整数的随机数生成器。

【问题讨论】:

  • 我认为drand48 会从 [0,1] 而不是 [0,1) 生成一个数字,那么您真正拥有的是什么?是的,这很重要。
  • 也许应该明确说明(或否认)分布应该均匀的基本假设。虽然 Open Group 将 the range of drand48 记录为 [0.0,1.0] 上的统一,但返回 1.0 的相应概率可以忽略不计。为了准确起见,我们可能会调用drand48,直到获得小于 1.0 的结果。
  • Math.random() explained的可能重复

标签: algorithm math random


【解决方案1】:

乘以n,发言并加1。

【讨论】:

  • 由于输入总是正数而输出是整数,因此转换为int 会比使用floor 更好。
  • @Jason 请问“发言”是什么意思,我不是以英语为母语的人。
  • @oussama:数字 x 的下限是满足 n
  • @AndreasRejbrand 这相当于 C 中的 n = (long)x,对吗?
  • 将 float 或 double 转换为整数类型会截断,因此它为 x >= 0 提供下限,为 x
【解决方案2】:

取RNG的结果,乘以n-1再加1。

【讨论】:

  • 由于不包括 1.0,n 会是一个更好的因素。
【解决方案3】:

c 中的示例:

long rand(int n)
{
    double rand1 = 0;

    rand1 = drand48();
    rand1 *= n - 1;
    rand1 += 1;

    return  (long)rand1;
}

【讨论】:

  • 您的代码的缺点是不是线性(或至少是单调)转换。但除了这个小缺陷之外,不保证 [1,n] 甚至是不正确的。
  • 它可以为任何足够小的rand1产生0。
  • 如果使用drand48(生成[0,1],虽然OP要求[0,1),但后来他也引用了drand48),乘以n-1添加 1 会是一个更好的主意。虽然它会偏向低端,但它至少是单调的,并且来自 [1,n]。
  • 您的更新现在可以为任何足够大的rand1 生成2n-1。只要摆脱这个 if 并做一个简单的线性变换并记住 rand1 是 [0,1] 的双精度数。
  • 现在它是正确的,虽然使用双字面量而不是整数会更干净,但没关系。但是我的反对意见仍然存在,因为它在很长一段时间内都是一个不正确的答案,并且需要广泛的帮助(实际上足以解决它自己的问题)才能得到纠正。
【解决方案4】:

我相信你可以有不同的随机数生成器。

Multiply by n, take the int, and add 1.

【讨论】:

  • 不完整的答案! “或”什么?
  • 对不起,我写的是不同的东西。
  • 我希望另一个答案的完美字面引用只是巧合!
  • 是的。他比我快1秒。我也是这么想的。
  • 你为什么要剪切粘贴我的答案?
猜你喜欢
  • 2011-07-07
  • 1970-01-01
  • 1970-01-01
  • 2013-04-23
  • 2014-04-11
  • 1970-01-01
  • 2013-01-02
  • 2014-03-31
  • 2023-01-03
相关资源
最近更新 更多