Як додавати елементи випадковим чином у вектор, використовуючи push_back

Як сказано в заголовку, мені виникли проблеми з додаванням випадкових чисел як елементів у вектор цілішого типу. Я включив час і бібліотеки stdlib працювати разом із векторною бібліотекою.

Моя спроба (використовуючи класи) до цих пір була:

Передати вектор у вигляді посилання на функцію, яка додає випадкові елементи у вектор. Крім того, передаючи посилання на змінну, яку я хочу оновити, і за допомогою покажчика, оголошеного в класі та визначеному у конструкторі, для зберігання адреси пам'яті змінної (та ж сама, яка була вказана в попередніх рядках).

class PlayerHand

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

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

playerHand::playerHand()

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

   pPointer = &giveCard;
}


void playerHand::populateHand(vector &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) << " ";
 }
 }

Тому після того, як я скомпілю код, елементи у векторі є однаковими числами, а не різними. Яку помилку в коді я роблю?

0
@Зелберт Так, що я мав на увазі, якими аргументами ви називаєте це? Що точно виклик виглядає?
додано Автор jogojapan, джерело
Ви використовуєте refVector як ім'я члена даних і як назву локальної змінної в функції-члені. Не робіть цього.
додано Автор jogojapan, джерело
Ви використовуєте refVector як ім'я члена даних і як назву локальної змінної в функції-члені. Не робіть цього.
додано Автор jogojapan, джерело
Як ви називаєте populateHand ?
додано Автор jogojapan, джерело
Як ви називаєте populateHand ?
додано Автор jogojapan, джерело
@Зелберт Так, що я мав на увазі, якими аргументами ви називаєте це? Що точно виклик виглядає?
додано Автор jogojapan, джерело
@Зелберт Так, що я мав на увазі, якими аргументами ви називаєте це? Що точно виклик виглядає?
додано Автор jogojapan, джерело
вони всі рівні до того ж givecard .. що ви намагаєтеся досягти тут ..?
додано Автор Karthik T, джерело
@ Зелберт просто називайте це без параметрів і заповнюйте випадкові значення.
додано Автор Karthik T, джерело
@ Зелберт просто називайте це без параметрів і заповнюйте випадкові значення.
додано Автор Karthik T, джерело
вони всі рівні до того ж givecard .. що ви намагаєтеся досягти тут ..?
додано Автор Karthik T, джерело
@Jogojapan - спасибі за голови, до речі, я називаю populateHand як звичайну функцію в основній функції на стекі.
додано Автор Denzel Pressey, джерело
@Jogojapan - спасибі за голови, до речі, я називаю populateHand як звичайну функцію в основній функції на стекі.
додано Автор Denzel Pressey, джерело
@KarthikT - Я намагаюся додати випадкові числа, які представляють карти в руку гравця, я моделюю карткову гру божевільної вісімки, тому я хотів поставити значення giveCard в функцію через pPointer, а потім скористатися посиланням ( refGiveCard), щоб оновити значення giveCard до абсолютно іншого номера
додано Автор Denzel Pressey, джерело
@KarthikT - Я намагаюся додати випадкові числа, які представляють карти в руку гравця, я моделюю карткову гру божевільної вісімки, тому я хотів поставити значення giveCard в функцію через pPointer, а потім скористатися посиланням ( refGiveCard), щоб оновити значення giveCard до абсолютно іншого номера
додано Автор Denzel Pressey, джерело
Вибач, я пропустив те, що ви дійсно говорили. ось. distributeCard start; playerHand theHand; playerHand * указательPHand = новий playerHand; distributeCard * pointerDistributeCard = new distributeCard; theHand.populateHand (покажчикPHand-> refVector, pointerDistributeCard-> giveCard);
додано Автор Denzel Pressey, джерело
Вибач, я пропустив те, що ви дійсно говорили. ось. distributeCard start; playerHand theHand; playerHand * указательPHand = новий playerHand; distributeCard * pointerDistributeCard = new distributeCard; theHand.populateHand (покажчикPHand-> refVector, pointerDistributeCard-> giveCard);
додано Автор Denzel Pressey, джерело
Вибач, я пропустив те, що ви дійсно говорили. ось. distributeCard start; playerHand theHand; playerHand * указательPHand = новий playerHand; distributeCard * pointerDistributeCard = new distributeCard; theHand.populateHand (покажчикPHand-> refVector, pointerDistributeCard-> giveCard);
додано Автор Denzel Pressey, джерело

6 Відповіді

One problem is that pPointer, giveCard and refGiveCard may not refer to the same memory location. As jogojapan & Karthik pointed out you may also be adding the values to a different vector. You don't show all the code for this so it's hard to tell. Assuming they all do refer to the same memory location and you are adding the values to the correct vector your issue is caused by the call to srand().

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

Зазвичай ви будете викликати srand() на початку вашої програми або коли ви дійсно потребуєте , щоб перейти на RNG.

Вилучіть виклик до srand() з playerHand() і populateHand() і помістіть його в main() і це має подбати про вашу проблему.

1
додано
Дуже дякую. Я не показав решту коду (я хотів якнайкраще скоротити навантаження), але я зроблю, як ви запропонували з srand ().
додано Автор Denzel Pressey, джерело

One problem is that pPointer, giveCard and refGiveCard may not refer to the same memory location. As jogojapan & Karthik pointed out you may also be adding the values to a different vector. You don't show all the code for this so it's hard to tell. Assuming they all do refer to the same memory location and you are adding the values to the correct vector your issue is caused by the call to srand().

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

Зазвичай ви будете викликати srand() на початку вашої програми або коли ви дійсно потребуєте , щоб перейти на RNG.

Вилучіть виклик до srand() з playerHand() і populateHand() і помістіть його в main() і це має подбати про вашу проблему.

1
додано
Дуже дякую. Я не показав решту коду (я хотів якнайкраще скоротити навантаження), але я зроблю, як ви запропонували з srand ().
додано Автор Denzel Pressey, джерело

One problem is that pPointer, giveCard and refGiveCard may not refer to the same memory location. As jogojapan & Karthik pointed out you may also be adding the values to a different vector. You don't show all the code for this so it's hard to tell. Assuming they all do refer to the same memory location and you are adding the values to the correct vector your issue is caused by the call to srand().

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

Зазвичай ви будете викликати srand() на початку вашої програми або коли ви дійсно потребуєте , щоб перейти на RNG.

Вилучіть виклик до srand() з playerHand() і populateHand() і помістіть його в main() і це має подбати про вашу проблему.

1
додано
Дуже дякую. Я не показав решту коду (я хотів якнайкраще скоротити навантаження), але я зроблю, як ви запропонували з srand ().
додано Автор Denzel Pressey, джерело

Ви оновлюєте refGiveCard , але ви додаєте giveCard . Тому вони всі однакові цінності.

Існує також той факт, що ви додаєте інший вектор, ніж можна було очікувати, як зазначив Йогапан.

0
додано

Ви оновлюєте refGiveCard , але ви додаєте giveCard . Тому вони всі однакові цінності.

Існує також той факт, що ви додаєте інший вектор, ніж можна було очікувати, як зазначив Йогапан.

0
додано

Ви оновлюєте refGiveCard , але ви додаєте giveCard . Тому вони всі однакові цінності.

Існує також той факт, що ви додаєте інший вектор, ніж можна було очікувати, як зазначив Йогапан.

0
додано
IT KPI C/С++ новым годом
IT KPI C/С++ новым годом
747 учасників

Чат обсуждения С/С++. - Вопросы "напишите за меня лабу" - это оффтоп. - Оффтоп, флуд, оскорбления и вбросы здесь не приняты. - За нарушение - предупреждение или mute на неделю. - За спам и рекламу - ban. Все чаты IT KPI: https://t.me/itkpi/1147