Программа генерации случайных чисел


У меня возникли проблемы с генератором случайных чисел. За неделю 0 всего, я хочу установить стартовое количество тараканов в доме (totalRoachesInHouseA) до 97, а количество тараканов в доме Б (totalRoachesInHouseB) до 79. Затем в течение недели от 1 до 10, я хочу, чтобы генерировать случайные числа для обоих домов. Я пытаюсь получить те же цифры в Примере моделирования ниже.

Initial Population: Week 0: House 1 = 97; House 2 = 79
Week 1: House 1 = 119; House 2 = 109
Week 2: House 1 = 151; House 2 = 144
Week 3: House 1 = 194; House 2 = 189
Week 4: House 1 = 25; House 2 = 247
Week 5: House 1 = 118; House 2 = 235
Week 6: House 1 = 198; House 2 = 260
Week 7: House 1 = 280; House 2 = 314
Week 8: House 1 = 37; House 2 = 395
Week 9: House 1 = 187; House 2 = 374
Week 10: House 1 = 315; House 2 = 414

Здесь представлены инструкции по проекту:

Напишите программу, которая отслеживает количество тараканов в два соседние дома уже несколько недель. Количество тараканов в домов будет определяться следующим образом:

  1. Первоначальное количество тараканов для каждого дом является случайным числом между 10 и 100.
  2. Каждую неделю, количество тараканов увеличивается на 30%.
  3. Два дома имеют общую стену, через которые тараканы могут мигрировать от одного к другому. В течение недели, если дом имеет больше тараканов чем другие, тараканов из дома с высшими населения перенести в дом с меньшим населением. В частности, 30% от разница (с округлением вниз) в популяции мигрирует.
  4. Каждые четыре недели, один из домов посетил дезинсектором, что привело к сокращению 90% (с округлением вниз) в количестве тараканов в этом доме. Реализация должна использовать функции и местного переменных.

Вот что я так далеко:

int roachesInHouseA, roachesInHouseB; //my two houses.
int temporaryHouseA, temporaryHouseB;
double totalRoachesInHouseA, totalRoachesInHouseB; //the total count of houses. 
int week;


int main( )
{
    int temporaryHouseA = 0; // storage for arithmetic
    int temporaryHouseB = 0; // storage for arithmetic

    int totalRoachesInHouseA = 97; // test number for A
    int totalRoachesInHouseB = 79; // test number for B

    roachesInHouseA = rand() % 100 + 10;
    roachesInHouseB = rand() % 100 + 10;

    //The functions declaring the random count of roaches in both houses between 
    //10 and 100.
    for (int Z = 1; Z < 12; Z++) // My for loop iterating up to 11 weeks.
    {
        totalRoachesInHouseA = totalRoachesInHouseA + roachesInHouseA * .3; 
        totalRoachesInHouseB = totalRoachesInHouseB + roachesInHouseB * .3; 

        // My function declaring that the roach population explodes by 30% weekly.
        cout << "The number of roaches in House A is " << totalRoachesInHouseA << endl;   
        cout << "The number of roaches in House B is " << totalRoachesInHouseB << endl;   


        if ((week == 4) || (week == 8)) // It's extermination time!
        {
            totalRoachesInHouseA = totalRoachesInHouseA - roachesInHouseA * .9;
            totalRoachesInHouseB = totalRoachesInHouseB - roachesInHouseB * .9;
        }
        else if (totalRoachesInHouseA > totalRoachesInHouseB) // Migration from  
        //House A to HouseB 
        {
            temporaryHouseA = totalRoachesInHouseA * .3;
            totalRoachesInHouseA = totalRoachesInHouseA - temporaryHouseA;
            totalRoachesInHouseB = totalRoachesInHouseB + temporaryHouseA;
        }
        else if (totalRoachesInHouseA < totalRoachesInHouseB) // Migration from  
        // House B to House A
        {
            temporaryHouseB = totalRoachesInHouseB * .3;
            totalRoachesInHouseB = totalRoachesInHouseB - temporaryHouseB;
            totalRoachesInHouseA = totalRoachesInHouseA + temporaryHouseB;
        }
    }
}


1109
4
задан 8 ноября 2011 в 04:11 Источник Поделиться
Комментарии
2 ответа

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

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

int main(void) { 
house_t houses[2];

// 1. put initial population in each house:
populate(houses[0]);
populate(houses[1]);

for (week = 1; week < N; week++) {
// 2. each week, each house's population increases
increase_pop(houses[0]);
increase_pop(houses[1]);

// 3. each week, a percentage of the population may migrate between the houses
do_migration(houses[0], houses[1]);

// 4. every four weeks, an exterminator visits one of the houses
if (week % 4 == 0)
exterminate(random_choice(houses, 2));

// 5. Presumably we want to show the data for each house weekly.
show(houses[0]);
show(houses[1]);
}
}

Кое-что о том, что код может быть открыт для вопрос-например, в спецификации, кажется, не указать, как выбрать, какие дома уничтожены в любой момент времени. Я использовал random_choice, но, возможно, ты думаешь, что строгое чередование имеет больше смысла. В любом случае, однако, важным моментом является то, что мы видим здесь должно быть как можно ближе к прямой перевод действия, указанные в требовании в синтаксис целевого языка. Оттуда, мы можем определить суб-частей в относительной изоляции друг от друга.

Прямо сейчас, это делает жизнь намного проще для преподавателя: это довольно легко просматривать основной и выяснить, соответствует ли он требованиям. Тогда он может заглянуть через каждую из функций и убедиться в том, что функция делает то, что он должен так же.

Я также отмечу, что та же основная идея применяется, когда школа закончилась, а ты писать реальный код. Большая разница здесь заключается в том, что вы будете тратить много времени на то, что учитель делает сейчас, читая и анализируя код, а не просто писать это. В школе, как правило, пишут код и (почти) никогда не смотреть на него. В реальной жизни, вы живете с кодом после того как вы написали его.

Я подозреваю, что у вас есть идея написать код и заставить его работать, затем разбив ее на функции. Я бы не советовал. Это делает значительно более сложная работа.

Я также обратите внимание, как это меняет ситуацию, если (например) вы нуждаетесь/хотите изменить параметры. Например, предположим, у вас есть 5 (или 50) дома подряд, и хотел запустить ситуацию за год вместо 10 недель. С код, как я написал выше, что в основном означает переписывание всего кода, который явно относится к домам[0] или домов[1] вместо того, чтобы использовать циклы и относятся к домам[я]. Не пытайтесь идти за борт с этой идеей. Если вы можете сделать код более гибким, как это без добавления дополнительных сложностей, большой. В то же время не тратить (много) дополнительное время или письменной работы против возможных изменений в требования, которые могут никогда не произойти.

3
ответ дан 8 ноября 2011 в 04:11 Источник Поделиться

Не использовать глобальные переменные.

int roachesInHouseA, roachesInHouseB; //my two houses.
int temporaryHouseA, temporaryHouseB;
double totalRoachesInHouseA, totalRoachesInHouseB; //the total count of houses.
int week;

Лучше использовать локальные переменные и передавать их в качестве параметров функции. Имея глобальные переменные (лучше знать, как изменчивый глобального состояния) делает его трудно изменить программу из других ситуаций (также известный как жесткая связь).

Также не объявить несколько переменных в одной строке (не ленитесь, одна переменная в строке).

Объявлять переменные можно ближе к точке, где вы собираетесь его использовать.
Здесь вы объявляете покажи как миллион миль от точки использования.

int temporaryHouseA = 0; // storage for arithmetic
int temporaryHouseB = 0; // storage for arithmetic

В чем разница между totalRoachesInHouseX и roachesInHouseX

int totalRoachesInHouseA = 97; // test number for A
int totalRoachesInHouseB = 79; // test number for B

Это дает вам число между 10 и 110. Не совсем то, что вы хотите.

roachesInHouseA = rand() % 100 + 10;
roachesInHouseB = rand() % 100 + 10;

Чтобы проверить вещи, которые происходят каждые 4 недели попробовать:

(weeks % 4) = 0 /* Or any constant from 0 -> 3 */

Я не думаю, что дезинсектор и плотвы движутся являются эксклюзивными. Тараканов двигаться, даже если истребитель заходит.

Также разница в 30% (не 30% от общего объема).

Как у нас есть два дома точно так же, вы можете использовать массив, а не отдельные переменные.
Это позволяет сделать более гибким.

Обработка Случайных

RAND() возвращает случайное число из последовательности (т. е. он возвращает текущее значение из последовательности, затем шагом к следующей позиции). Последовательность инициируется srand (), которая задает начальную точку последовательности (внимание, добавляя одну к входу, не переместить его в одно место последовательность его немного больше фантазии). Обычно вы должны начать srand() такой:

srand(time(NULL)); // Call ONLY once just after main() starts

Но для тестирования это хорошо, чтобы получить те же самые случайные числа каждый раз, когда вы запустите. Для этого инициировать случайной последовательности в той же точке.

srand(0);  // Initiate the rand at point 0 in the sequence.

1
ответ дан 8 ноября 2011 в 07:11 Источник Поделиться