【问题标题】:generating a random double between 0 and infinity in java在java中生成0到无穷大之间的随机双精度
【发布时间】:2016-02-14 10:06:18
【问题描述】:

我有这个代码

我正在尝试向“fun”方法发送随机双精度

这里的 BL 是双精度数 1

   double inf=Double.POSITIVE_INFINITY;
   double rand=inf*R.nextDouble();
   double myrand=fun(rand)*BL;
   mylist.get(i).set_speed(myrand);

这里是“有趣”的方法

double fun(double v)
{
   return ((pow(A,K)*exp((-1)*A*v)*pow(v,K-1))/(fact(K-1)));
}

但是速度参数的输出总是NaN

【问题讨论】:

  • 无限在 IEEE 754 中定义;但这并不意味着它是无穷大的值。见Wikipedia on IEEE 754 double precision
  • 不会将无穷大乘以随机生成的双精度值总是无穷大吗?这不是破坏随机目的吗?
  • 一个数的无穷乘以总是无穷
  • 生成一个介于 0 和无穷大之间的随机数将花费无限的计算时间和无限的存储空间。如果我是你,我会把目光放低一点。

标签: java random nan infinity


【解决方案1】:

你不能得到介于 0 和无穷大之间的数字。

因为如果可以的话,你会得到一个无穷大的数字。

1.但是你可以得到一个具有最大值的随机数,例如:

int random(int max)
{
    return (int) (Math.random() * max);
}

2.最小数量:

int random(int min, int max)
{
    int range = (max - min) + 1;
    return (int) (Math.random() * range) + min;
}

3.如果您不想要任何小数,请键入:

int random(int min, int max)
{
    int range = (max - min) + 1;
    return (int) Math.round((Math.random() * range) + min);
}

否则,如果你想向下或向上取整:

//round down
(int) Math.floor((Math.random() * range) + min);

//round up
(int) Math.ceil((Math.random() * range) + min);

给号码发消息:

//between 500 1000 (function 2 or 3)
JOptionPane.showMessageDialog(null, random(500, 1000));

//or just maximal: 1000 (function 1)
JOptionPane.showMessageDialog(null, random(1000));

希望对你有帮助:)

【讨论】:

    【解决方案2】:

    要获得一个带正号的双精度值,大于或等于 0.0 且小于 Double.MAX_VALUE:

    double r = Math.random()*Double.MAX_VALUE
    

    然后只需将结果传递给您的函数。

    【讨论】:

    • 这不会产生一个随机的double然后乘以最大值,导致超过最大值吗?
    • 否,因为Math.random() 总是返回一个介于 0 和 1 之间的数字。
    • 啊,很高兴知道。好吧,@Leet-Falcon,除非你编辑你的帖子,否则我无法删除我的反对票。
    【解决方案3】:

    尝试将这行inf*R.nextDouble(); 更改为Double.MAX_VALUE * R.nextDouble(); 如果您还需要不时获取Double.POSITIVE_INFINITY,那么您必须实现额外的if 块并在某些情况下随机返回Double.POSITIVE_INFINITY

    【讨论】:

      【解决方案4】:

      据我所知,double 无法达到无穷大。试试这个

      double rand = R.nextDouble(Double.MAX_VALUE- 1);
      

      这将创建一个介于 0 和双精度最大值之间的随机双精度

      【讨论】:

      • nextDouble();不带参数
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-13
      • 1970-01-01
      • 2021-01-06
      • 1970-01-01
      • 2016-06-11
      • 2016-01-08
      相关资源
      最近更新 更多