对象数组对于每个项目始终具有相同的随机数

时间:2014-07-04 01:03:14

标签: c++

开始使用简单的纸牌游戏再次尝试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();

}

如果我创建了一个卡片对象数组然后输出它,那么阵列中的每张卡都具有相同的套装和值。我不确定如何让每张卡随机排列。

2 个答案:

答案 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>