开始使用简单的纸牌游戏再次尝试c ++。我为每张卡片创建了一个带有两个构造函数的类,一个没有值,随机创建卡片,另一个构造值。
#include <string>
#include <iostream>
#include <stdlib.h> /* srand, rand */
#include <ctime>
#include <sstream>
class Card
{
private:
char suit;
int value;
public:
Card();
Card(char suit, int value);
void SetSuit(char suit);
void SetValue(int value);
...
std::string GetCard() ;
};
Card::Card(char suit, int value)
{
suit= toupper(suit);
this -> suit=suit;
this -> value=value;
}
Card::Card() //create random card
{
srand (time(0));
char suits [4] = {'D','S','H','C'};
int randNum = (rand() % 4);
SetSuit(suits[randNum]);
randNum = (rand() % 12)+2;
SetValue(randNum);
...
std::string Card::GetCard(){
...
return card.str();
}
如果我创建了一个卡片对象数组然后输出它,那么阵列中的每张卡都具有相同的套装和值。我不确定如何让每张卡随机排列。
答案 0 :(得分:5)
问题在于:
srand (time(0));
int randNum = (rand() % 4);
可能在您的系统上,time(0)
会返回此纪元的秒数。因此,当您多次调用此代码而不进行第二次处理时,它将获得相同的值。因此,每次都会得到相同的随机数。
你应该在每个程序运行时只执行一次srand
。如果你需要任何严重的随机性,那么你需要更多的熵,而不仅仅是time(0)
。即使您解决了这个问题,如果所有的运行都在同一秒内开始,您仍然可以多次执行您的程序并每次都获得相同的卡序列。
rand()
通常的工作方式是生成一长串数字,如果你知道种子就可以预测,但很难从数字的一个子集中预测。 srand
函数表示&#34;在此点开始序列&#34;。如果每次从同一点开始,每次都会得到相同的随机数。 Further reading
答案 1 :(得分:3)
仅在您的应用程序启动时调用srand(time(0))
,例如,在main()
函数,而不是在创建任何卡时。{/ p>