変数の値がinput
ループ内で変更されることはないため、終了条件input != secretNumber
が満たされることはありません。
ループ内で入力を取得する必要があります。したがってcin >> input
、ループの最初に書き込みます。
編集:
コンピューターが推測する必要がある場合でもinput
、ループ内での値を変更する必要がありますが、これはコードには存在しません。ループはinput
毎回同じ値で実行されます。
コンピュータに推測させるには、いくつかのスキームに従う必要があります。secretNumber = rand()%100 + 1
コンピューターはランダムに数字を描くことがあります-ループ内を移動することでそれを得ることができます。ただし、このアプローチはうまく機能しない可能性があり、ループは非常に長い間実行される可能性があります。これは@Kaiiの回答に示されています。
より効率的なアプローチは、バイナリ検索です。この場合、コンピュータが行う推測を追跡する必要があります。2つの変数high
を保持し、それぞれlow
より高い推測と低い推測を格納する必要がありinput
ます。推測が数値よりも大きい場合は常に、に格納し、high
推測がよりも小さい場合はに格納input
しlow
ます。次に、コンピュータはとの間で新しい推測を試みる必要がhigh
ありlow
ます。ランダムな推測はですsecretNumber = low + rand() % (high - low)
。最悪の場合、100回もの反復が必要になります。最良の結果を得るには、それぞれの推測はである必要があります(high + low) / 2
。条件に応じて、high
およびの1つがlow
各反復で更新されます。このアプローチにより、コンピューターは7回の推測で正しい数を推測します。
コードでは、次のようになります。
int secretNumber = rand() % 100 + 1; // random number between 1-100
int tries=0;
int input;
int low = 1, high = 100;
cout <<"typ your number\n";
cin >> input;
do
{
secretNumber = (high + low) / 2;
cout << secretNumber <<endl;
++tries;
if (secretNumber > input)
{
cout << "Too high I guess?\n";
high = secretNumber;
}
else if (secretNumber < input)
{
cout << "Too low I guess?\n";
low = secretNumber;
}
else
{
cout << "Yes, i got it in " << tries << " tries!";
}
} while (input != secretNumber);
return 0;