Java 如何生成能够提供正确除法结果的随机数

Java 如何生成能够提供正确除法结果的随机数,java,math,decimal,Java,Math,Decimal,如何生成能够提供适当除法结果的随机数(即结果应精确舍入到小数点后的1或2位) (例如,一个整数乘以一个提供十进制结果的十进制数-我在下面给出了一组样本输入) 值得注意的是,所有整数都可以除以0.4、0.8或2.5,并表示为小数点后两位。这是因为它与乘以2.5、1.25和0.4相同 然而,如果你有一个除数,而这个除数不是真的,你可以在循环中这样做 double divisor = 2.4; double factor = 100/divisor; Random rand = new Random

如何生成能够提供适当除法结果的随机数(即结果应精确舍入到小数点后的1或2位)

(例如,一个整数乘以一个提供十进制结果的十进制数-我在下面给出了一组样本输入)


值得注意的是,所有整数都可以除以0.4、0.8或2.5,并表示为小数点后两位。这是因为它与乘以2.5、1.25和0.4相同


然而,如果你有一个除数,而这个除数不是真的,你可以在循环中这样做

double divisor = 2.4;
double factor = 100/divisor;
Random rand = new Random();
int maxValue = 1000;
double ERROR = 1e-14*maxValue;

for(int i=0;i<100;i++) {
long randNum;
do {
   randNum = rand.nextInt(maxValue+1);
    if (Math.abs(randNum * factor - (long) (randNum * factor)) > ERROR)
        System.out.println("reject "+randNum + " => "+randNum/divisor);
} while(Math.abs(randNum * factor - (long) (randNum * factor)) > ERROR);
System.out.println(randNum + " => "+randNum/divisor);

这将生成随机数,直到您得到一个0.01的倍数。

如果您希望结果“四舍五入”到小数点后2位(这不是真正的四舍五入,它只是一个有两个小数点的有限十进制表示法),则只需生成除数,并使被除数始终为100,例如:

 106250 / 100 = 1062.5
 116875 / 100 = 1168.75
如果你想要更有趣的红利,那么除以除数和红利。e、 g.第一个可以是以下任何一个:

 (/1):   106250 / 100 = 1062.5
 (/2):   53125 / 50 = 1062.5
 (/10):  10625 / 10 = 1062.5
 (/4):   26562.5 / 25 = 1062.5
 (/125): 850 / 0.8 = 1062.5
说明:

你取一个整数n,然后乘以某物。如果这是一个像34.56这样的数字,我们把小数点前的部分称为w(整部分),把小数点后的部分称为.xy

如果你把它乘以n,你会以(n*w)+(n*(x/10))+n*(y/100)结束。点后面永远不会有小数3部分密码-你同意吗

我们可以把x和y组合成一个单独的部分,比如说(n*w)+(n*(xy/100)),而xy只是0到100之间某个事物的名称

由于小数点之前的部分可以任意大,如果需要0以外的值,可以单独计算。但你必须以某种方式定义一个范围。如果为该部分取一个随机整数R:

res = input * R * random.nextInt (100) / 100.0;
你需要除数吗

div = 100.0 / (R * random.nextInt (100));
在测试代码fragmenst时,Scala总是很方便:

val r = util.Random 
r: util.Random.type = scala.util.Random$@ce2f12

scala> def res (input: Int) = input * r.nextInt (100) / 100.0;
res: (input: Int)Double

scala> (1 to 20).map (res) 
res338: scala.collection.immutable.IndexedSeq[Double] =
Vector(0.48, 1.58, 0.48, 2.8, 0.15, 1.98, 5.67, 3.36, 6.93, 6.0, 9.02, 0.48, 7.41, 6.44, 9.6, 1.92, 16.66, 5.94, 7.98, 18.4)
对我来说,除数和除数都是随机数。我必须给出一个不需要舍入小数超过2位的答案

如果是这样,答案可能是“没有这样的数字”。下面是我为验证这一假设而编写的一个Java小程序:

import java.text.DecimalFormat;

public class Test {
    public static void main(String[] args) {
        double num = Math.PI;
        DecimalFormat format = new DecimalFormat(
                "####################################0." +
                "00##############################");
        while (true) {
            for (int i = 1; i < Integer.MAX_VALUE; i++) {
                double tmp = (i / num) * 100;
                if (tmp == (long) tmp) {
                    System.err.println("Solution - " + i + " - " + 
                            format.format(tmp) + " - " + format.format(num));
                    break;
                }
            }
            pi = Math.nextAfter(num, 1);
        }
        System.err.println("No solution for " + format.format(num));
    }
}

花了1.79亿次尝试才找到除数的解。

除数和红利的范围应该是多少?不是答案,所以我将其作为评论发布,但请确保您理解本文,因为它可能会影响您的解:这里哪些数字是随机数-除数还是红利?如果您需要精确的1或2位小数,为什么不能只处理整数,然后再除以100?如何生成结果和devidor,并从中生成第3位?这有点作弊,但可能会解决问题:\@马特:我想:如果你把1除以3,你会得到03333…-如果你除以100/3,得到33.3333。您建议先进行整数除法(100/3=33),然后再除以100=>(0.33),但最后总是会出现舍入问题。33*3等于0.99。33/100是0.33。他不是在寻找舍入技术,而是寻找(数字乘以100)的适当除数。该如何调用代码?解决办法是什么?我只看到整数(randNum:=long)和接近整数(randNum*factor)的结果<代码>14600.000000000002,38000.0,31300.000000000004,25500.0,11300.0,37900.0,…也许我调用/初始化错误?我猜你没有管理舍入错误。如果你有产生舍入误差的操作,你需要在打印它们时格式化它们。所以你只需要生成.0、.25、.5和.75?我理解这个问题,每个分数都像.01,.02。89、.99应该是整数,而不仅仅是四分之一。我的理解是数字应该是整数,除法后应该是0.01的倍数。对于某些除数,你只能得到某些分数。好吧,@Joe没有澄清问题。因此,我开始投他的反对票。我们在这里工作了一年又一年,一小时又一小时,一天又一天,他已经失去了兴趣?正如我的样本所述,这是一个整数除以一个小数点,得到的答案在小数点后最多有两位小数。你的样本显示它带有整数除法,这是不正确的。@Joe:你说的“例如”意思是,这是一种可能的方法,而不是唯一的方法。必须更清楚。
div = 100.0 / (R * random.nextInt (100));
val r = util.Random 
r: util.Random.type = scala.util.Random$@ce2f12

scala> def res (input: Int) = input * r.nextInt (100) / 100.0;
res: (input: Int)Double

scala> (1 to 20).map (res) 
res338: scala.collection.immutable.IndexedSeq[Double] =
Vector(0.48, 1.58, 0.48, 2.8, 0.15, 1.98, 5.67, 3.36, 6.93, 6.0, 9.02, 0.48, 7.41, 6.44, 9.6, 1.92, 16.66, 5.94, 7.98, 18.4)
import java.text.DecimalFormat;

public class Test {
    public static void main(String[] args) {
        double num = Math.PI;
        DecimalFormat format = new DecimalFormat(
                "####################################0." +
                "00##############################");
        while (true) {
            for (int i = 1; i < Integer.MAX_VALUE; i++) {
                double tmp = (i / num) * 100;
                if (tmp == (long) tmp) {
                    System.err.println("Solution - " + i + " - " + 
                            format.format(tmp) + " - " + format.format(num));
                    break;
                }
            }
            pi = Math.nextAfter(num, 1);
        }
        System.err.println("No solution for " + format.format(num));
    }
}
Gotcha! - 179453441 - 5712180438.00 - 3.1415926535897714