如何生成随机数,以提供适当的除法结果



如何生成随机数,以提供正确的除法结果(即结果应四舍五入到小数点后正好 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亿次尝试才找到该除数的解决方案。

相关内容

  • 没有找到相关文章

最新更新