-1

私はこれをしたいです

A と B の 2 つの数値があり、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 < 比率 < 1.05) === NOT (0.95 < 比率AND比率 < 1.05) ==== [...]

ルールは次のとおりです: すべてのANDORに変更し、すべての部分式を否定します。

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

于 2013-08-20T14:14:08.320 に答える
1

あなたの do..while ループ条件は

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

于 2013-08-20T13:54:29.903 に答える