【问题标题】:Java: Generating a random double between the range of a negative double and a positive doubleJava:在负双精度和正双精度之间生成随机双精度
【发布时间】:2017-04-11 02:18:59
【问题描述】:

我不太熟悉如何改变 Math.random 或 new Random() 的范围来生成这样的双精度。我需要能够在 -10 到 25 美分之间产生双倍(我的程序正在处理金钱;因此我说美分)。一个单独的实例正在生成 90 到 -75 美分之间的随机双倍。我在寻找答案时看到了这个:

double 结果 = Math.random() * (upper - lower) + lower;

但是当我在我的代码中实现这个想法时,当使用正数和负数之间的范围时,范围似乎不起作用...... 我用 0.25 的上限和 -0.10 的下限对其进行了测试,但注意到在我所做的一个测试实例中它打印了 0.3567587946356543。所以由此我得出结论,我显然没有正确调整范围..

请帮忙:(

这是我第一次使用stackoverflow,所以请放轻松,如果我说的任何内容没有意义,我会详细说明..

这是我使用此代码的现有方法:

public double variation(double price){
    //formula: (Math.random() * range) + min; where range = max - min
    //80% of the time returns amount between -10 & 25 cents
    if(Math.random() > 0.19){ 
        return (Math.random() * 0.35) - 0.10;
    }
    //20% of the time returns amount between -75 & 90 cents
    return (Math.random() * 1.65) - 0.75;
}

我知道该方法会收取它不使用的双倍价格;接受双倍价格但忽略其价值是老师要求的一部分。所以请忽略它。

【问题讨论】:

  • upperlower 中的值 - 将这些行添加为代码 sn-p
  • 当它打印 0.35... 时,它来自范围 -.75 到 0.90 的 20% 部分
  • 您想要2位输出(如0.17)还是更长的输出(如0.11432810481633897)
  • @theProgrammer101 个人我更喜欢 2 位数的输出,但老师并不关心东西看起来有多“漂亮”。
  • 顺便说一句,处理金钱的程序应该从不使用浮点数。

标签: java random


【解决方案1】:

现在您已经在问题中包含了所有代码,所以我的答案改为:

当它打印0.3567587946356543 时,当if(Math.random() > 0.19){ 中的第一个Math.random() 调用变为false 时,它​​来自范围-.75 到0.90 的20% 部分。

旧答案:

我认为您忘记了较低值的减号:

double upper = 0.25;
double lower = -0.10;
double result = Math.random() * (upper - lower) + lower;

【讨论】:

  • 天哪,我现在感觉很笨哈哈!有道理,谢谢
  • 如果它解决了你的问题,然后点击左侧的灰色复选标记
【解决方案2】:

要在-1025 之间生成,请尝试这样做:-

Random r = new Random();
int d = r.nextInt(35)+1;
d = d - 10;
double result = d/100.0;

一个班轮

double result = ((r.nextInt(35)+1)-10)/100.0;

【讨论】:

  • 我需要生成一个 double,而不是 int。在这种情况下,-10 美分是 -0.10 的下限,而 25 美分是 0.25 的上限
  • 啊,我明白了。所以只是为了确认一下,r.nextInt() 会随机选择一个介于 0 到 35 之间的 int 吗?
  • @SamanthaHallcox 是的,我们从中减去10,得到一个介于-1025 之间的值。然后我们除以100,得到所需的结果。跨度>
  • 我绝对遵循你给我的。我坚持的一件事是你有 int d = r.nextInt(35) + 1 的行,如果你得到 35 作为随机 int,那么在后续代码之后我不会得到 0.26?还是不包括35?
  • @SamanthaHallcox 它不包括它。检查docs
【解决方案3】:

看起来你的公式实际上是正确的:

double result = Math.random() * (upper - lower) + lower;

您可以通过将可能的最小值和最大值随机(为零,1)来测试它

Random Value | Result
---------------------------
0            | -0.1 (lower)
1            | 0.25
0.5          | 0.075
0.01         | -0.0965

回过头来获得结果为0.356758795 的随机值,Math.random() 必须返回1.305025128,但情况并非如此。 :)

话虽如此,Apache Commons3 有这个漂亮的方法RandomUtils.nextDouble(double startInclusive, double endInclusive); 可以为你做这件事。

【讨论】:

  • 但这就是问题所在,我需要结果介于 -0.10 和 0.25 之间。老实说,我是java的初学者,所以我不确定Apache Commons3是什么哈哈(假设它与java有关)
  • 抱歉,我已经编辑了 Apache Commons3 的代码 - 它实际上包含两端。 :) 您的公式实际上是正确的 - 我尝试将最小值和最大值随机放置 :)
【解决方案4】:

要获得带长小数的输出: 这有点粗糙,但它可以完成工作。

Random rand = new Random();// creates 'Random' method
int number = rand.nextInt(35)+1;// gets a random integer out of 35
double randDouble = rand.nextDouble();//gets a random double
double finalNumber = ((number + randDouble)-10)/100;//adds the integer and the double,
                                                    //subtracts ten, and divides by 100
System.out.println(finalNumber);// prints the number

以下是一些输出示例(完全复制和粘贴)。

  • 0.22748959958842008
  • 0.1963085030978741
  • 0.17300671109908058
  • -0.002656673961685705
  • -0.08854411636457332
  • 0.03578255664449403

要获得具有两位数输出的输出:

Random rand = new Random(); // creates 'Random' method
    float x = rand.nextInt(35)+1; // gets a random integer(0 through 35)
    float y = x - 10; // subtracts that number by ten(making the new range -10 through 25)
    float z = y/100; // puts number in decimal form

注意这一行int number = rand.nextInt(35)+1(在长十进制版本中)。你必须在最后做+1的原因是因为Java将1理解为0。见下图

JAVA   |0 1 2 3 4 5
-------|-----------
HUMANS |1 2 3 4 5 6

【讨论】:

  • 这不会产生负值。
  • 对不起,我不小心把它发了没有完成。让我快速编辑一下。
  • 它现在生成负值。对此感到抱歉!
【解决方案5】:

我以 400.0 和 - 400.0 为例。

double min = 400.0; double max = 2 * min; System.out.println(Math.random() * max - min);

输出是

138.0921773815627 212.7567891431654 9.063135840057157 -256.8594518458244 -99.84573995806142 116.53331370219462 33.29613621235126

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-16
    • 1970-01-01
    • 1970-01-01
    • 2014-02-13
    • 1970-01-01
    • 2011-02-11
    • 2016-01-08
    • 2013-08-10
    相关资源
    最近更新 更多