【问题标题】:Using rand() to shuffle cards but no shuffling happens使用 rand() 洗牌但没有洗牌发生
【发布时间】:2012-09-01 22:38:10
【问题描述】:

我正在尝试使用 rand() 函数洗牌,但由于某种原因,当我尝试查看洗牌后的牌组是什么样子时,它完全没有洗牌。我不确定我错过了什么,所以任何帮助将不胜感激。

void Deck::Shuffle()
{


for (int j = 0; j <= 51; j++)
{
    srand(time(0));
    int i = 1 + rand()%52;
    int k = 1 + rand()%52;

    Card temp = theDeck[i];
    theDeck[i] = theDeck[k];
    theDeck[k]= temp;
}
}

编辑:谢谢大家的帮助。我已经修复了现在可以阅读的代码。

 void Deck::Shuffle()
{
srand(time(0));

for (int j = 0; j <= 51; j++)
{

    int i = 1 + rand()%52;
    int k = 1 + rand()%52;

    Card temp = theDeck[i];
    theDeck[i] = theDeck[k];
    theDeck[k]= temp;
}
}

【问题讨论】:

标签: c++ algorithm random shuffle


【解决方案1】:

除了随机播种问题之外,您还可以使用表达式 1 + rand()%52; 来计算交换指数。这会生成一个介于 152 之间的数字,这意味着您永远不会洗牌中的第一张牌,并且您会冒着修改数组边界之外的数据的风​​险。

【讨论】:

  • 我想知道为什么第一张牌从来没有被洗过。所以基本上我不应该使用1+?
  • @Rapptz: rand()%51 永远不会返回 51。你想要的表达式就是rand()%52
【解决方案2】:

srand 只应在每次程序执行时调用一次,而不是每次调用rand 时。由于当今计算机的速度,您的循环运行得如此之快,以至于您可能每次都获得相同的随机数,因为您不断使用相同的种子重置随机数生成器(时间,可能不会改变完全通过你的执行)。修复它。

更新: 您的修复更好,但更好的是:

int main()
{
    srand(time(0));

    // the rest of your program here.
}

【讨论】:

    【解决方案3】:

    您的问题可能与反复快速连续调用 srand 有关。

    本质上,如果你调用它的速度足够快,time(0) 将返回相同的值,这意味着你播种 rand 的值将是相同的,这将为你的循环中的 rand 返回相同的值。尝试在 for 循环之前只调用 srand 一次。例如:

    srand(time(0));
    
    for (int j = 0; j <= 51; j++)
    {
        int i = 1 + rand()%52;
        int k = 1 + rand()%52;
    
        Card temp = theDeck[i];
        theDeck[i] = theDeck[k];
        theDeck[k]= temp;
    }
    

    【讨论】:

    • 另外,Benjamin Lindley 的正确做法是,您通常应该只调用 srand 一次,而不是每次进入函数时。以上更多的是应该工作的kluge,并允许您测试它是否真的是问题。
    猜你喜欢
    • 2021-06-14
    • 1970-01-01
    • 1970-01-01
    • 2013-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-09
    • 2020-03-11
    相关资源
    最近更新 更多