2010-10-05 2 views
1
//Generate Food Personality 
for(i=0; i<food.size(); i++) 
{ 
    srand(time(0));  
    int randomFood = rand() % 6; 

    if(randomFood == 1 || randomFood == 3 || randomFood == 5) 
    { 
     badFood.push_back(food[randomFood]); 
    } 
    else if(randomFood == 0 || randomFood == 2 || randomFood == 4) 
    { 
       goodFood.push_back(food[randomFood]); 
    } 
} 
cout << "Size of Food Vector: " << food.size() << endl; 
cout << "Size of Bad Food: " << badFood.size() << endl; 
cout << "Size of Good Food " << goodFood.size() << endl; 

randomFood случайного числа до 6, и он принимает случайное число в продуктах питания [] и добавляет его вектор в зависимости от того, как случайное числа получается.Случайного числа всегда генерирует 1 номер

Моя проблема заключается в том, что она всегда генерирует нечетное или четное число. а bad и good.size() всегда печатаются как 6 или 0, никогда ничего.

+4

Не используйте использование оператора modulo с генераторами случайных чисел; который использует наименее значимые биты (которые являются почти детерминированными), а не ведущие биты (которые ближе к псевдослучайному). Разделите на шесть и обрезайте до целого числа. –

+8

Я не могу устоять: http://xkcd.com/221/ –

+0

О, черт возьми. Я смеялся. –

ответ

10

Вызов srand(time(0)); в начале цикла сбрасывает генератор случайных чисел каждый раз через цикл. Таким образом, вы будете получать одинаковое начальное случайное число каждый раз.

(Технически было бы возможно, чтобы возвращалось другое значение между итерациями цикла for, но с учетом скорости современных процессоров это было бы очень редким случаем, когда это происходит для кода, который вы предоставили.)

В любом случае, вы должны вызвать srand право перед петли for (или, еще лучше, только один раз в начале main рутины вашей программы.)

4

поставил srand() вне вашего for петли , Вы всегда повторно инициализируете свое случайное семя.

1

Позвоните srand(time(0)) только один раз за нить. Его не следует вызывать несколько раз, как в вашем цикле.

2

Переместить srand() вне цикла.

Ваш цикл, вероятно, занимает менее секунды каждый раз, так что time(0) всегда возвращается то же значение (его разрешение составляет одну секунду), поэтому srand(time(0)) всегда высева генератор случайных чисел с той же семени, так что rand() является всегда используя одну и ту же последовательность, так что вы получаете одинаковое случайное число каждый раз вокруг цикла.

1

Я думаю, это потому, что вы повторно засеиваете генератор случайных чисел для каждой итерации цикла. Перемещение srand(time(0)); сторона сбоку петли

3

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

Кроме того, не следует использовать оператор modulo с генераторами случайных чисел; который использует наименее значимые биты (которые являются почти детерминированными), а не ведущие биты (которые ближе к псевдослучайному). Разделите на шесть и обрезайте до целого числа.

Наконец, я бы рекомендовал заменить излишнее

else if(randomFood == 0 || randomFood == 2 || randomFood == 4) 

с

else 
+0

Комментарий, который получил все три вещи, которые я заметил. Я лично делал случай 0; 2; 4 ... перерыв; default ;, но что угодно, чтобы удалить ненужный пух. – WernerCD

2

Вы должны переместить вызов srand выше петли for. Этот цикл выполняется очень быстро (скорее всего), поэтому time возвращает одно и то же значение каждый раз, поэтому вы повторяете генератор случайных чисел с тем же значением, которое будет генерировать тот же список psudo-случайных чисел.Вы используете только один член одного и того же списка снова и снова, пока часы компьютера не перейдут в следующую секунду.

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