#c #arrays #pointers #struct
#c #массивы #указатели #структура
Вопрос:
// Store the original deck Card* temp = deck.Cards; // For loop that iterates through array for (int i = 0; i lt; 52; i ) { int randomIndex = rand() % 52; deck.Cards[i] = deck.Cards[randomIndex]; deck.Cards[randomIndex] = temp[i]; }
Я хочу перетасовать массив, который я уже создал, размером 52. Это сегмент моего кода, по какой-то причине в результирующем массиве отсутствует много значений, так как некоторые из них дублируются. Разве последние две строки не должны просто поменять местами значения?
Ответ №1:
temp
это еще один указатель на тот же массив — карты не дублируются, поэтому, когда вы перезаписываете карту в исходном массиве в теле цикла, то же изменение также будет «видно» через temp
.
Наилучшей практикой для переключения элементов в массиве является использование временной переменной для переключаемого элемента. Например.:
// For loop that iterates through array for (int i = 0; i lt; 52; i ) { int randomIndex = rand() % 52; Card temp = deck.Cards[i]; deck.Cards[i] = deck.Cards[randomIndex]; deck.Cards[randomIndex] = temp; }
Ответ №2:
В C вы не должны использовать указатели, если в этом нет необходимости. И знаете ли вы, что стандартная библиотека C поставляется с функцией перемешивания? Используя это, вам даже не нужно самостоятельно реализовывать функцию подкачки, и вы повторно используете проверенный код.
Вы также могли бы использовать std::swap().Карты[i], колода.Карты[Случайный индекс]);
#include lt;algorithmgt; #include lt;arraygt; #include lt;iostreamgt; #include lt;randomgt; class Card { public: Card() : m_id{ g_id } { }; std::size_t id() const { return m_id; } private: std::size_t m_id; static std::size_t g_id; }; // to generate a new instance id for each Card std::size_t Card::g_id{ 0 }; // or make a Cards member in Deck that is a std::array // this is just a short version to show you the direction. using Deck = std::arraylt;Card, 52gt;; int main() { // random generator stuff C style std::random_device rd{}; std::default_random_engine random_generator{ rd() }; // a deck Deck deck; // show start order of cards for (const autoamp; card : deck) std::cout lt;lt; card.id() lt;lt; " "; std::cout lt;lt; "n"; // shuffle the cards // https://en.cppreference.com/w/cpp/algorithm/shuffle std::shuffle(deck.begin(), deck.end(), random_generator); // show shuffled order of the cards for (const autoamp; card : deck) std::cout lt;lt; card.id() lt;lt; " "; std::cout lt;lt; "n"; return 0; }