random_shuffle每次产生相同的结果

时间:2013-08-16 17:06:29

标签: c++ random stl shuffle

我试图改变一副牌,但random_shuffle每次产生相同的结果

void
Deck::shuffle() {

    cout << "SHUFFLING CARDS!!!\n\n";

    srand(time(0));
    random_shuffle(cards.begin(), cards.end());

    displayCards();
}

5 个答案:

答案 0 :(得分:5)

这是因为你每次都将伪随机数生成器播种到相同的值:

srand(time(0));

time的粒度是秒,如果我没有弄错的话。如果您在调用Deck::shuffle()之间暂停执行一段时间,您会看到不同的结果。

从函数中删除该行,并在程序开始时调用它一次。

答案 1 :(得分:1)

我认为问题在于你将srand(...)放在你的函数中。

尝试将其移到外面(这样它只会被执行一次)

答案 2 :(得分:1)

每次拨打shuffle时,您都在重新播种随机数生成器。

每个应用程序只应为随机数生成器播种一次(通常在应用程序初始化中):

int main()
{
    // other initialization
    srand(time(NULL)); // seed the number generator

    // ...
}

答案 3 :(得分:0)

重要的是要知道,为了能够接收“随机”数字,您必须为发电机播种。它也应该在功能之外播种。

srand(time(NULL));

使用时间功能有助于确保您收到随机数。

time.h确实需要包含才能工作。有关srand的更多参考,请单击here

答案 4 :(得分:0)

我不熟悉random_shuffle,但这里有一个完美的洗牌功能 - 换句话说,每个52!甲板的排列必须同样可能。

这是来自Gayle Laakmann的 Cracking the Coding Interview (问题20.2)

void Deck::shuffle() {

int temp, index;

for (int i = 0; i < cards.size(); i++){

    index = (int) (rand() %(cards.size() - i)) + i;

    temp = cards[i];
    cards[i] = cards[index];
    cards[index] = temp;

        }
}
相关问题