0

私は C++ の初心者で、私のプロジェクトの 1 つは、ループ内のループと乱数の作成に関係しています。これが私がこれまでに持っているものです: `

using namespace std;

int main()
{   
    srand((unsigned int)time(0));

{
    cout << "Name of reservoir: ";
    string reservior_name;
    cin >> reservior_name;

    cout << "Capacity in MAF: ";
    double capacity;
    cin >> capacity;

    cout << "Maximum inflow in MAF: ";
    int max;
    cin>> max;

    cout << "minimum inflow in MAF: ";
    int min;
    cin >> min;
    if(min>max)
    {cout<<endl<<"Error: The minimum inflow is higher than the maximum inflow."<<endl
         << "Please re-enter your minimum inflow: ";
    cin>>min;
    }
    double inflow_range= max-min;

    cout <<"required outflow in MAF: ";
    double required;
    cin >> required;
    if (required > 0.9 * (min + max)/2)
    {
        cout<<endl<< "Warning: required ouflow is over 90% of the average inflow."<<endl
            << "Returning to main menu ";
    }
    else
    { const     int simulations = 10;
                int water_level = 0;
                int years = 1;
                cout << "Running simulation..." << endl;
                for (int i = 1; i <= simulations; i++) 
                {
                    int x = (rand()% (max-min + 1)) + min;

                    while (water_level < capacity)
                    {
                        //double r = rand() * 1.0 / RAND_MAX;
                        //double x = min + inflow_range * r;
                        //int x = (rand()% (max-min + 1)) + min;
                        if (water_level + x > required)
                        {
                        water_level = water_level + x - required;
                        }
                        else
                        {
                            water_level= 0;
                        }
                        years++;

                    }   
                cout <<"Simulation "<< i <<" took " << years <<" years to finish"<< endl;
                }
    }
}
system ("pause");
return 0;       
}
`

したがって、私の主な質問は、「シミュレーションの実行」の下にある for ループの設定に関する壁にぶつかっていることです。最初の for ループを設定して、内部の for ループを 10 回実行する必要があります。内部 for ループは、ランダム値のクエリからの許容可能な結果の範囲の乱数を考え出します。アイデアはモンテカルロ法を使用することであると言われました。つまり、モンテカルロ法と通常の乱数生成法の両方をここに入れました。ここにあります:

for (int i = 1; i <= simulations; i++) 
                {
                    int x = (rand()% (max-min + 1)) + min;

                    while (water_level < capacity)
                    {
                        //double r = rand() * 1.0 / RAND_MAX;
                        //double x = min + inflow_range * r;
                        //int x = (rand()% (max-min + 1)) + min;

そのため、プログラムは流入に対してランダムな値を作成します。内部 for ループは、0 から始まるリザーバーの fill_level が容量に達するまで実行し続けるという考え方です。何年かをシミュレートするプロセス (1 年を表す内部 for ループの各反復) は、water_level シミュレーション for ループの親 for ループによって 10 回繰り返されます。

問題は、作成されるはずの乱数が同じ数であることです。実行するたびに異なりますが、新しいシミュレーションを作成するためにループが繰り返されるたびに同じです。私は何時間も問題が何であるかを理解しようとしましたが、まだ立ち往生しています。どんな助けでも大歓迎です。

4

2 に答える 2

0

x示されているコードでは、各反復 (シミュレーション) は、シミュレートされたすべての年に対して単一の値を取得します。コメントアウトされたコードはx、毎年の新しい値を生成します。ご希望の方法はどれですか?流入量は年ごとに変化すると考えがちなので、x毎年新しい値を生成する必要があります。

また、シミュレーションごとにリセットする必要があるようyearsですwater_level

cout << "Running simulation..." << endl;
for (int i = 1; i <= simulations; i++) 
{
    int water_level = 0;
    int years = 1;

    while (water_level < capacity)
    {
        int x = (rand() % (max - min + 1)) + min;
        if (water_level + x > required)
            water_level += x - required;
        else
            water_level = 0;
        years++;
    }
    cout <<"Simulation "<< i <<" took " << years <<" years to finish"<< endl;
}

また、デバッグのために、制御パラメーター ( minmaxcapacity、 )を出力してから、内部ループの反復ごとにrequiredキー値 ( yearx、 ) を出力し、それが正しく機能していることを確認したいと思います。water_levelwhile

于 2013-05-20T06:38:15.187 に答える