我不太熟悉如何更改 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;
要在-10
和25
之间生成,请尝试执行:-
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