gpt4 book ai didi

c++ - 实现洗牌的逻辑

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:34:34 25 4
gpt4 key购买 nike

我正在尝试为一副纸牌实现一个类。 “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 是一个数为 no 的整数。牌组中剩余的牌数,deck::dcards 是牌组中牌的数组。

我的问题是:这不会产生很好的结果。难道我需要通过指针来传递引用来做到这一点吗?如果是这样,它是如何完成的?

或者,它可能只是糟糕的算法?也许我只需要一个更好的洗牌逻辑。请说。注意:是的,我知道“algorithm.h”库中有一个 std::shuffle std::random_shuffle 函数,但这些函数仅适用于 vector ,而不适用于我在这里使用的数组,不是吗?

更新:nvm,我刚刚意识到我的问题可以在这里得到解答: http://blog.codinghorror.com/the-danger-of-naivete/

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

最佳答案

当你做的时候

srand(time(NULL));

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

您应该为随机数生成器只播种一次,最好尽早在 main 函数中播种。


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

关于c++ - 实现洗牌的逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22680097/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com