尝试获得两个数字的"adjusted"比率

Trying to get an "adjusted" ratio of two numbers

本文关键字:数字 两个 adjusted 比率      更新时间:2023-10-16

我想做这个

我有两个数字,A和B,其中A可以大于或小于B。我想做的是:

  1. 比较B和A

  2. 如果他们的比率是一个范围的"ouside",那么取一个随机数并将其添加到"a"-现在检查他们的新比率是否符合条件

    0.95 < ratio < 1.05
    
  3. 如果没有,尝试另一个随机。

我的问题是我遇到了无限循环。。。这就是我所做的:

float ratio = A/B;
if (ratio < 0.95  || ratio > 1.05) {
    do {
        // randomly take a negative or positive number
        float random_n = ((float)rand())/RAND_MAX - 0.50; 
        // get an even smaller step
        random_n *= 0.1;
        // add or subtract the random number (depending on its sign)
        A += random_n;
        // form the ratio again 
        ratio = A / B;
        cout << "lets see " << A  << "  " << B << "  " << ratio << endl;        
    }
    while (ratio > 0.95 || ratio < 1.05);
}

条件应该是:

while (ratio <= 0.95 || ratio >= 1.05);

你把"<"answers">"搞混了比率小于或等于0.95或大于或等于1.05,则不是在0.95和1.05之间。

如果你记得如何否定连词,就很容易避免这样的错误:

NOT(0.95<比值<1.05)===NOT====[…]

规则是:将每个AND更改为OR并否定所有子表达式:

[…]===(NOT(0.95<比率)或NOT[比率<1.05))====(0.95>=比值OR比值>=1.05)===

您的do..while循环条件应该是

while(ratio <= 0.95 || ratio =>1.05)

问题是你增加了A而从未改变B

并且仍然期望比率在(0.95,1.05)。这取决于A和B的初始值来打破循环。

尝试:

    B=rand()%RAND_MAX;
    do {
    A=rand()%RAND_MAX;
    ratio = A/B;
    cout<<"lets see "<< A  <<"  "<< B <<"  "<<ratio<<endl;        
   }while(ratio <0.95 || ratio>1.05);

然后可以根据你的需要将A和B除以10的幂。

对于连续运行的不同随机值,也使用srand(time(0))