2013-05-20 2 views
0

Я новичок в C++ и для одного из моих проектов задействован цикл внутри циклов и создание случайных чисел. Вот то, что я до сих пор: `Такие же случайные числа создаются каждый раз, когда цикл проходит.

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;  
} 
` 

Так что мой главный вопрос, я бегу в стену относительно Наладка для петель под ним«Запуск моделирования», где нужно создать первый цикл для запуска внутреннего цикла в 10 раз, причем каждая из этих 10 итераций внутреннего цикла петли со случайными числами для диапазона допустимых результатов запроса для случайного значения. Мне сказали, что идея заключается в использовании метода Монте-Карло, т. Е. Я включил здесь метод Монте-Карло и метод генерации нормальных случайных чисел. Вот он:

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; 

поэтому программа создаст случайное значение для притока. Идея состоит в том, что внутренний цикл цикла будет продолжать работать до тех пор, пока заполняющий уровень резервуара, начинающийся с 0, не достигнет емкости. Процесс имитации того, сколько лет (каждая итерация внутреннего для цикла, представляющего год), повторяется 10 раз родителем для цикла моделирования water_level для цикла.

Проблема в том, что случайное число, которое должно быть создано, - это то же самое число. Все они меняются каждый раз, когда я запускаю его, но они одинаковы каждый раз, когда петли повторяются, чтобы сделать новую симуляцию. Я попытался выяснить, что проблема в течение нескольких часов и все еще застряла. Любая помощь очень ценится.

+0

Если вы можете использовать C++ 11, используйте это из библиотеки std, будет проще: http://en.cppreference.com/w/cpp/numeric/random – UldisK

ответ

1

x случайный в вашем коде, проблема заключается в алгоритме и вычислении после этого. Смотрите код live.

Вы забыли сбросить параметры моделирования на каждой итерации, поместить эти внутри цикла моделирования:

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

Посмотреть код после этого издания: live code. Выход

Simulation 1 took 68 years to finish 
Simulation 2 took 101 years to finish 
Simulation 3 took 8 years to finish 
+0

Но будет ли оно достаточно коротким, чтобы быть то же самое в 10 раз? Я попытался запустить его, вероятно, примерно в 50 раз, и они продолжают давать мне такое же количество лет для всех 10 симуляций .... –

+0

ДА !!!! ОНО РАБОТАЕТ!!! БОЛЬШОЕ СПАСИБО!!!! Я ЛЮБЛЮ ВАС, РЕБЯТА!! –

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; 
} 

И для отладки, я хочу, чтобы напечатать параметры управления (min, max, capacity, required), а затем распечатать ключевые значения (year, x, water_level) на каждой итерации внутреннего while пока я не был удовлетворен, он работал правильно.

+0

Да, приток варьируется от года к году, а также от итерации к итерации. Я не знаю, как исправить это. У вас есть предложения, которые я должен использовать? –

+0

FYI: «резервуар» - стандартное правописание. Является ли MAF «миллионами акров?»? –

+0

ДА !!!! ОНО РАБОТАЕТ!!! БОЛЬШОЕ СПАСИБО!!!! Я ЛЮБЛЮ ВАС, РЕБЯТА!! –

Смежные вопросы