实现卡改组的逻辑

时间:2014-03-27 06:41:28

标签: c++ performance algorithm logic shuffle

我正在尝试为一副纸牌实施课程。其中一个功能“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/

所以这是一个逻辑缺陷,而不是我的实现。

2 个答案:

答案 0 :(得分:3)

当你这样做时

srand(time(NULL));

您将种子设置为当前时间。由于此循环将在一秒内运行(time函数的正常分辨率),因此种子将在循环中重置为相同的起始值,这使您几乎总是每次都获得相同的随机数。

您应该只为种子发送一次,最好尽早在main函数中播种。


您可能还想查看new PRNG functionality in C++11

答案 1 :(得分:2)

如果您需要对序列进行随机播放,则应考虑std::random_shuffle(或C ++ 11中的std::shuffle)。它对序列中的元素进行重新排序,以使这些元素的每个可能的排列具有相同的出现概率。是的,它可以与数组一起使用,而不仅仅是向量。任何&#34;范围&#34;。

现在回到你的代码,你有种子问题。生成(伪)随机数的算法采用初始值,即种子。给同一种子他们产生相同的数字序列。这意味着您只需要生成一次(每个线程)生成的随机数,否则您将反复生成相同的数字序列。在你的这个循环中你会得到相同的数字一段时间,直到时间改变为种子的新值被使用。