Прежде всего, всем привет!Это мой первый вопрос здесь, так что я надеюсь, что я не облажался.Я много гуглил, прежде чем писать здесь.Я новичок в кодировании, в C ++, и я изучаю его самостоятельно.
Учитывая, что мне сказали, что это хорошая практика (я, вероятно, ошибаюсь здесь), начинать произвольный движок только один раз,Каков правильный / лучший / более эффективный способ использования std::mt19937
из случайной стандартной библиотеки внутри класса, засеянного std::chrono::high_resolution_clock::now().time_since_epoch().count()
из стандартной библиотеки хроно?
Я хочу использовать это значение хроно, потому чтоон меняется очень быстро и порождает ужасное число.Я никогда не рассматривал std::random_device
, потому что я думаю, что это довольно теневое.Я, вероятно, снова ошибаюсь.
РЕДАКТИРОВАТЬ: В большинстве случаев я пишу код и учусь на своем телефоне Android с IDE C4Droid, потому что у меня не так много свободного времени, чтобы сидеть направильный компьютер, поэтому я думаю, что std::random_device
не очень надежен.
Я успешно это сделал, прежде чем знал, что такое класс, но сейчас я изучаю классы и много пробовал иошибка (помещая static_casts везде, пробуя const, static и т. д., потому что код всегда выдавал ошибки), чтобы сделать это:
class Deck
{
private:
std::array<Card, 52> m_card;
const int m_seed {static_cast<int>(std::chrono::high_resolution_clock::now().time_since_epoch().count())};
std::mt19937 m_rng {m_seed};
int rng(int min, int max)
{
std::uniform_int_distribution<> rng{min, max};
return rng(m_rng);
}
void swapCard(Card &a, Card &b)
{
Card temp {a};
a = b;
b = temp;
}
public:
Deck()
{
int index{0};
for (int iii {0}; iii < Card::CS_MAX; ++iii)
{
for (int jjj {0}; jjj < Card::CR_MAX; ++jjj)
{
m_card[index] = Card(static_cast<Card::CardSuit>(iii), static_cast<Card::CardRank>(jjj));
++index;
}
}
}
void printDeck() const
{
for (int iii {0}; iii < 52; ++iii)
{
m_card[iii].printCard();
if (((iii + 1) % 13 == 0) && iii != 0)
std::cout << '\n';
else
std::cout << ' ';
}
}
void shuffleDeck(int xTimes = 1)
{
for (int iii {0}; iii < xTimes; ++iii)
{
for (int jjj {0}; jjj < 52; ++jjj)
{
swapCard(m_card[jjj], m_card[rng(0, 51)]);
}
}
}
};
Это работает, но я не знаю, правильно ли этоделать это.Кроме того, мне сказали, что переменные, которые никогда не меняются, можно сделать статическими, чтобы делиться ими со всеми объектами класса, но я не могу сделать статический m_seed ...
Я уверен, что есть более эффективный способделая это.Ребята, вы можете помочь?