2013-06-27 2 views
0

Как указано в заголовке, у меня возникли проблемы с добавлением случайных чисел в качестве элементов в вектор целочисленного типа. Я включил библиотеки времени и stdlib для совместной работы с векторной библиотекой.Как добавить элементы случайным образом в вектор с помощью push_back

Моя попытка (с помощью классов) до сих пор:

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

class PlayerHand 

{ 
    public: 
      playerHand(); 
      void populateHand(vector<int>&, int&) 

    private: 
      vector<int> &refVector; 
      int *pPointer; 
      int giveCard; 
}; 

playerHand::playerHand() 

{ 
    srand((time(NULL)));  
    giveCard = (rand() % 14) + 1; 

    pPointer = &giveCard; 
} 


void playerHand::populateHand(vector<int> &refVector, int &refGiveCard) 

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

    refVector.push_back(*pPointer); //dereference thepointer to store value in giveCard 
    srand(time(0));      
    refGiveCard = (rand() %14) + 1; /*Here is where I'm trying to update the reference 
            so before the next loop, the reference should have 
            a new updated value*/ 

    cout << refVector.at(i) << " "; 
} 
} 

Итак, после компиляции кода элементы в векторе имеют одинаковый номер и не отличаются друг от друга. Какую ошибку в коде я делаю?

+3

все они равны одному и тому же 'givecard' .. чего вы пытаетесь достичь здесь ..? –

+1

Вы используете 'refVector' как имя элемента данных и как имя локальной переменной в функции-члене. Не делай этого. – jogojapan

+2

Как вы называете 'populateHand'? – jogojapan

ответ

1

Одна из проблем заключается в том, что pPointer, giveCard и refGiveCard могут не ссылаться на то же место в памяти. Как jogojapan & Karthik указал, что вы также можете добавлять значения к другому вектору. Вы не показываете весь код для этого, так что трудно сказать. Предполагая, что они все do ссылаются на ту же ячейку памяти, и вы добавляете значения в нужный вектор, ваша проблема вызвана вызовом srand().

Проблема в том, что вы [почти] всегда высеваете генератор случайных чисел с тем же значением. Это происходит потому, что когда вы вызываете time(0), оно возвращает прошедшее время в секундах. Когда вы вызываете его многократно и очень быстро, он возвращает такое же значение, пока часы не увеличатся до следующей секунды.

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

Удалить вызов srand() из playerHand() и populateHand() и поместить его в main() и он должен заботиться о вас проблемы.

+0

Большое спасибо. Я не показывал остальную часть кода (я хотел как можно лучше сократить нагрузку), но я сделаю так, как вы предложили с помощью srand(). –

0

Вы обновляете refGiveCard, но добавляете giveCard. Поэтому они имеют одинаковое значение.

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