我正在尝试为一副纸牌实施课程。其中一个功能“deck”包含shuffle。
void deck::shuffle()
{
int cardsleft = deck::cards;
for(int i = 0; i < cardsleft ; i++)
{
srand(time(NULL));
int rdmn = rand() % cardsleft;
card tempcard = deck::dcards[rdmn];
deck::dcards[rdmn] = deck::dcards[i];
deck::dcards[i] = tempcard;
}
}
为了清楚起见,deck :: cards是一个整数,表示没有。在这个牌组中留下的卡片,卡片:: dcards是这个牌组中的一系列牌。
我的问题是:这没有给出非常好的结果。难道我需要通过指针来做这个,传递引用吗?如果是这样,它是如何完成的?
或者,这可能只是糟糕的算法吗?也许我只需要一个更好的改组逻辑。请说。注意:是的我知道“algorithm.h”库中有一个std :: shuffle std :: random_shuffle函数,但这些函数只适用于向量,而不是我在这里使用的数组,不是吗?
更新:nvm,我刚才意识到我的问题可以在这里得到解答: http://blog.codinghorror.com/the-danger-of-naivete/
所以这是一个逻辑缺陷,而不是我的实现。
答案 0 :(得分:3)
当你这样做时
srand(time(NULL));
您将种子设置为当前时间。由于此循环将在一秒内运行(time
函数的正常分辨率),因此种子将在循环中重置为相同的起始值,这使您几乎总是每次都获得相同的随机数。
您应该只为种子发送一次,最好尽早在main
函数中播种。
您可能还想查看new PRNG functionality in C++11。
答案 1 :(得分:2)
如果您需要对序列进行随机播放,则应考虑std::random_shuffle
(或C ++ 11中的std::shuffle
)。它对序列中的元素进行重新排序,以使这些元素的每个可能的排列具有相同的出现概率。是的,它可以与数组一起使用,而不仅仅是向量。任何&#34;范围&#34;。
现在回到你的代码,你有种子问题。生成(伪)随机数的算法采用初始值,即种子。给同一种子他们产生相同的数字序列。这意味着您只需要生成一次(每个线程)生成的随机数,否则您将反复生成相同的数字序列。在你的这个循环中你会得到相同的数字一段时间,直到时间改变为种子的新值被使用。