1

次のコードを見てください

#include <iostream>
#include <stdlib.h>
#include <ctime>

using namespace std;

int main()
{
    enum Movement{STAND=1,WALK,RUN,CRAWL};

    srand(time(0));
    Movement state = (Movement)(1+rand()%4);

    for(int i=0;i<10;i++)
    {

    cout << state << endl;

    switch(state)
    {
        /*Here the logic is,
         * 
         * 1. From stand, he can walk or crawl
           2. From Walk, he can stand or run
           3. From Run, he can walk
           4. From Crawl, he can stand
         */

        case STAND: 
            cout << "You can walk or crawl" << endl;        
            while(state==WALK || state==CRAWL)
            {
                state = (Movement)(1+rand()%4);
            }
            break;


        case WALK: 
            cout << "You can stand or run" << endl;
            while(state==STAND || state==RUN)
            {
                state = (Movement)(1+rand()%4);
            }
            break;


        case RUN: 
            cout << "You can walk" << endl;
            while(state==WALK)
            {
                state = (Movement)(1+rand()%4);
            }
            break;

        default: 
            cout << "You can stand" << endl;
            while(state==STAND)
            {
                state = (Movement)(1+rand()%4);
            }

    }

    }
}

私はランダムを使用しており、これらの条件に基づいてランダムな結果を期待しています。しかし、私は以下と同じ結果を得ています。

2
You can stand or run
2
You can stand or run
2
You can stand or run
2
You can stand or run
2
You can stand or run
2
You can stand or run
2
You can stand or run
2
You can stand or run
2
You can stand or run
2
You can stand or run

どうしてこれなの?do..while ループも試しました。全然ダメ。caseステートメントで指定した条件をチェックするものは何もありません。助けてください。

4

4 に答える 4

2

while ループを do-while に反転します。式はチェックに対しても無効です (意図的にテキストと一致しない場合を除きます)。メッセージによると、状態は次のとおりです。

Stand ==> (Walk || Crawl)
Walk  ==> (Stand || Run)
Run   ==> (Walk)
Crawl ==> (Stand)

したがって、セクションを次のように変更する必要があります

  1. チェックする前に、新しい乱数を生成します。と..
  2. 有効な生産に​​到達するまで放置しないでください。

後者の部分は、Run と Crawl の状態にとって重要です。それらは 1 つの有効な結果状態しか生成できないため、その値を探すために rand() 呼び出しをスピンしても意味がありません。新しい状態を設定して、もう一度ループするだけです。

上記(2)について:

    case WALK: 
        cout << "You can stand or run" << endl;
        while(state==STAND || state==RUN)
        {
            state = (Movement)(1+rand()%4);
        }
        break;

なる...

    case WALK: 
        cout << "You can stand or run" << endl;
        do {
            state = (Movement)(1+rand()%4);
        } while(state!=STAND && state!=RUN);
        break;

実行とクロールの状態について:

    case RUN: 
        cout << "You can walk" << endl;
        state = WALK;
        break;

    default: // CRAWL 
        cout << "You can stand" << endl;
        state = STAND;
        break;

それはあなた自身をチェックするためにあなたにもう1つ残っています、私はあなたに任せます.

于 2012-11-17T08:40:02.450 に答える
0

解決策:ループに移動Movement state = (Movement)(1+rand()%4);します。for

修正されたコード:

#include <iostream>
#include <stdlib.h>
#include <ctime>

using namespace std;

int main()
{
    enum Movement{STAND=1,WALK,RUN,CRAWL};
    srand(time(0));

    for(int i=0;i<10;i++)
    {

        Movement state = (Movement)(1+rand()%4);

        cout << state << endl;

        switch(state)
        {
            /*Here the logic is,
             * 
             * 1. From stand, he can walk or crawl
               2. From Walk, he can stand or run
               3. From Run, he can walk
               4. From Crawl, he can stand
             */

            case STAND: 
                cout << "You can walk or crawl" << endl;        
                while(state==WALK || state==CRAWL)
                {
                    state = (Movement)(1+rand()%4);
                }
                break;


            case WALK: 
                cout << "You can stand or run" << endl;
                while(state==STAND || state==RUN)
                {
                    state = (Movement)(1+rand()%4);
                }
                break;


            case RUN: 
                cout << "You can walk" << endl;
                while(state==WALK)
                {
                    state = (Movement)(1+rand()%4);
                }
                break;

            default: 
                cout << "You can stand" << endl;
                while(state==STAND)
                {
                    state = (Movement)(1+rand()%4);
                }

        }

    }

    return 0;
}

出力:

3
You can walk
1
You can walk or crawl
2
You can stand or run
1
You can walk or crawl
2
You can stand or run
3
You can walk
4
You can stand
2
You can stand or run
2
You can stand or run
4
You can stand

Press any key to continue
于 2012-11-17T08:42:16.670 に答える
0

ステート マシンで次のステップを次のように計算することもできます。

...

case STAND:
    cout << "You can walk or crawl" << endl;
    state = rand()%2 ? WALK : CRAWL;
    break;

...
于 2012-11-17T10:10:25.820 に答える
-2

定数シードを持つ C の rand() 関数は、何をしても常に同じ「ランダム」値を与える傾向があります。

より良い方法は、独自の RandomGenerator 関数を作成して使用することです

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

int RandomGenerator(int min, int max) // Generate min < random int < max
{
  int randNum;
  srand(rand()*time(NULL));
  randNum = rand() % max + min;
  // printf(" Random number is %d \n", randNum);
  return randNum;
}

Movement state = (Movement)(1+rand()%4);内側のforループも移動します

于 2012-11-17T08:40:26.717 に答える