-1

我想这样做

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

  1. 比较 B 和 A

  2. 如果他们的比率在范围之外,则取一个随机数并将其添加到“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);
}
4

3 回答 3

2

条件应该是:

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

你把“<”和“>”弄混了。如果小于或等于 0.95 或大于或等于 1.05,则比率不在 0.95 和1.05之间

如果您记得如何否定连词,就很容易避免此类错误:

NOT (0.95 < ratio < 1.05) === NOT (0.95 < ratio AND ratio < 1.05) ==== [...]

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

[...] === ( NOT (0.95 < ratio) OR NOT (ratio < 1.05)) ==== (0.95 >= ratio OR ratio >= 1.05) === (ratio <= 0.95 OR ratio >= 1.05)

于 2013-08-20T14:14:08.320 回答
1

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

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

于 2013-08-20T13:54:29.903 回答
0

问题是你在增加 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除以十的幂。

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

于 2013-08-20T14:08:14.827 回答