Java:在负双精度和正双精度范围之间生成随机双精度



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

双精度结果 = 数学随机() * (上限 - 下限) + 下限;

但是当我在我的代码中实现这个想法时,当使用正数和负数之间的范围时,范围似乎不起作用...... 我用 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;
}

我知道这种方法采用双倍价格,但它不使用;这是老师要求的一部分,接受双倍价格,但忽略它的价值。所以请忽略它。

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

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

旧答案:

我想你忘记了较低值的减号:

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

要在-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 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);为你做。

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

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

我以 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

最新更新