// Store the original deck
Card* temp = deck.Cards;
// For loop that iterates through array
for (int i = 0; i < 52; i ) {
int randomIndex = rand() % 52;
deck.Cards[i] = deck.Cards[randomIndex];
deck.Cards[randomIndex] = temp[i];
}
我想打亂我已經創建的大小為 52 的陣列。這是我的代碼段,出于某種原因,結果陣列出現了許多值丟失,因為有些值是重復的。最后兩行不應該只是交換值嗎?
uj5u.com熱心網友回復:
temp是另一個指向同一個陣列的指標——卡片沒有重復,所以當你在回圈體中覆寫原始陣列中的卡片時,同樣的變化也將通過temp.
切換陣列中元素的最佳實踐是對要切換的元素使用臨時變數。例如:
// For loop that iterates through array
for (int i = 0; i < 52; i ) {
int randomIndex = rand() % 52;
Card temp = deck.Cards[i];
deck.Cards[i] = deck.Cards[randomIndex];
deck.Cards[randomIndex] = temp;
}
uj5u.com熱心網友回復:
在 C 中,如果你不需要,你不應該使用指標。您是否知道 C 標準庫帶有 shuffle 函式?通過使用它,您甚至不必自己實作交換功能,并且可以重用經過測驗的代碼。
你也可以使用 std::swap(deck.Cards[i],deck.Cards[randomIndex]);
#include <algorithm>
#include <array>
#include <iostream>
#include <random>
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::array<Card, 52>;
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 auto& card : deck) std::cout << card.id() << " ";
std::cout << "\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 auto& card : deck) std::cout << card.id() << " ";
std::cout << "\n";
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/371822.html
