-1

私は、ユーザーが推測しなければならない乱数をコンピューターが選択するゲームを書いています。次に、コンピュータが推測しなければならない数字(彼は数字を推測するだけです)を選択するのはユーザーです。問題は、ゲームの後半で使用するrand()関数が、新しい範囲外の数値を提供することがあることです。たとえば、新しい範囲がlow=4およびhigh=10の場合、rand()は12を提供しますが、これは正しくありません。そのエラーの理由を理解しようとしていますが、見つかりません。私はDev-C++で書いています。コードはすぐ下にあり、その後に出力が続きます。あなたの助けと時間をありがとう。

#include<iostream>
#include<conio.h>
#include<stdlib.h>
#include<time.h>




using namespace std;

int main()
{
  int computer_guess, nbr, nbrguesses, count_user_guess=0, count_computer_guess=0; 
  char user_comparison;

  int  low=1, high=99;  //initialize low to the lower boundary and high to the higher     boundary

  srand(time(0));
  nbr=rand()% 99 + 1;  //computer chooses a random number between 1 and 99...

  do
  {
    cout << "guess a number now! " << endl;
    cin >> nbrguesses;     //user enters the number he guessed...
    if ( nbrguesses>nbr)
       cout << "too big" <<endl;
    else if ( nbrguesses<nbr)
       cout << "too small" << endl;
    else if ( nbrguesses==nbr)
       cout << " you found the correct number! " <<endl;

    count_user_guess++;  //count the number of guesses from the user
  }
  while (nbrguesses!=nbr);

  cout << "you tried " << count_user_guess <<" times to find the right number " <<      endl<<endl;

  cout << "----------------------------------------------------------------------" << endl;
  cout << "Now, the computer will guess your number " << endl;

  do
  {
    srand(time(0));
    computer_guess=rand()% high + low;    //computer guesses the number
    cout << "computer guess: " << computer_guess <<endl;
    cout << "is it the correct number?" << endl;
    cin >> user_comparison;     //if user enter 
    if (user_comparison=='>')  // character '>' it means the number guessed by computer is too big
    {
       cout << "too big" <<endl;
       high= computer_guess-1;   //high is given a new boundary 
       cout << "***Current value of high = " << high << " and low = " << low << endl;    //display current boundaries

    }
    else if ( user_comparison=='<')  //the number guessed by computer is too small
    { 
      cout << "too small" << endl;
      low= computer_guess+1;  //low is given a new boundary
      cout << "***Current value of low = " << low << " and high = " << high << endl;  //display current boundaries

    }
    else if ( user_comparison=='=')
       cout << "Computer found the correct number! " <<endl;

    count_computer_guess++;  //count number of guesses from computer
  }
  while (user_comparison!='=');

  cout << "The computer tried " << count_computer_guess <<" times to find the right number " << endl;

  cout << "The Game is over now, have a good day!" << endl;
  getch();

  return 0; 

}

//**************Output******************************************

guess a number now!
50
too big
guess a number now!
25
you found the correct number!
you tried 2 times to find the right number

----------------------------------------------------------------------
Now, the computer will guess your number
computer guess: 11
is it the correct number?
>
too big
***Current value of high = 10 and low = 1
computer guess: 3
is it the correct number?
<
too small
***Current value of low = 4 and high = 10
computer guess: 12
is it the correct number?
4

3 に答える 3

4

交換する必要があります

computer_guess=rand()% high + low;

computer_guess=rand()%(high- low + 1) + low;

あなたの例では、low=4とhigh=10があります。しかし、0から6までの乱数が必要で、4を追加します。0から10の間ではなく、14までの結果を得ることができます。上限を含めます([low、high]の代わりにInterval [low、high [))、括弧内の+1を省略する必要があります。

なぜ

rand()は、かなり大きな整数を返します。そして、そこから区間[a、b]の乱数を取得したいと思います。rand()%5を取ると、0、1、2、3、または4の数値が得られるため、区間[0,4]から取得します。一般に、rand()%Cは、区間[0、C-1]の乱数を示します。

Rand()%C + Dなどの定数を追加すると、間隔がシフトされます:[D、C-1+D]。問題に戻りますが、間隔を[a、b]にします。そのため、下部の結合にはa = D、上部の結合にはC-1 + D=bが必要です。これは、C = b-D + 1 = b-a+1に変換できます。したがって、rand()%(b-a + 1)+aを使用します。

これが物事がどのように機能するかを少し説明することを願っています。

于 2012-04-07T01:54:29.353 に答える
1

あなたはかなり近いですが、これを試してください:

rand()%(high-low)+low;

于 2012-04-07T01:53:57.270 に答える
1
srand(time(0));
computer_guess=rand()% high + low;    //computer guesses the number

srandまず、ループ内で呼び出さないでください。プログラムの起動時に一度呼び出すだけです。

第二に、その論理は間違っています。そのはず:

computer_guess=low + (rand() % (high-low+1));

(これは、高と低が包括的であることを前提としています。つまり、高が10で、低が1の場合、1と10の両方が許容可能な推測です。)

于 2012-04-07T01:54:27.633 に答える