如何生成随机数,以提供正确的除法结果(即结果应四舍五入到小数点后正好 1 或 2 位)。
(例如,一个整数乘以十进制数提供十进制结果 - 我在下面给出了一组示例输入)
2827 by 2.5 = 1130.8
1747 by 0.8 = 2183.75
425 by 0.4 = 1062.5
935 by 0.8 = 1168.75
res = input * random.nextInt (100) / 100.0;
解释:
你取一个整数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));
在测试代码碎片时,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)
值得注意的是,所有整数都可以除以 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);
指纹
729 => 303.75
285 => 118.75
84 => 35.0
123 => 51.25
999 => 416.25
75 => 31.25
reject 727 => 302.9166666666667
reject 842 => 350.83333333333337
504 => 210.0
reject 368 => 153.33333333333334
441 => 183.75
579 => 241.25
165 => 68.75
这将生成随机数,直到您得到一个是 0.01 倍的数字。
如果您希望结果"四舍五入"到小数点后 2 位(它不是真正的四舍五入,它只是一个带有两个小数点的有限十进制表示),那么只需生成除数,并使除数始终为 100,例如:
106250 / 100 = 1062.5
116875 / 100 = 1168.75
如果你想要更有趣的股息,那么除数和除数,例如,第一个可以是以下任何一个:
(/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
对我来说,除数和除数都是随机数。我必须给出一个不需要四舍五入小数点超过 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));
}
}
我运行了 10 分钟(从 PI 开始),没有找到任何没有解决方案i
num
值。 但我确实观察到解决方案可能非常稀疏。 例如:
Gotcha! - 179453441 - 5712180438.00 - 3.1415926535897714
花了1.79亿次尝试才找到该除数的解决方案。