0

我正在创建一个二十一点计划。我希望随机发牌。如果我使用 rand() 函数并将 srand() 初始化为 time(NULL),那么所有的卡片都是一样的。知道问题可能是什么吗?

//Cards.h
#include <iostream>
#include <time.h>
#include <cstdlib>
using namespace std;

class Cards
{
      private:
      int val_seed,suit_seed;
      public:
      int val[10];
      string card[10];
      int dealcard(int x)
      {   
          srand(); 
          val_seed=rand()%13 + 2;
          suit_seed=rand()%4 + 1;
          if(val_seed>=1 && val_seed<=10)
          {
                  if(val_seed==10)
                  {
                                  card[x]="10";
                  }
                  else
                  {
                      card[x]=val_seed+48;
                  }
          }
          else if(val_seed>10)
          {
               switch(val_seed)
               {
                               case 11: card[x]="J"; val_seed=10; break;
                               case 12: card[x]="Q"; val_seed=10; break;
                               case 13: card[x]="K"; val_seed=10; break;
                               case 14: card[x]="A"; val_seed=11; break;
               }
          }
          switch(suit_seed)
          {
                           case 1: card[x]+='\3'; break;
                           case 2: card[x]+='\4'; break;
                           case 3: card[x]+='\5'; break;
                           case 4: card[x]+='\6'; break;
          }
          val[x]=val_seed;
      }

};
//main.cpp
#include <cstdlib>
#include <iostream>
#include "Cards.h"

using namespace std;

int main(int argc, char *argv[])

{
    Cards k;
    for(int a=1; a<=9; a++)
    {
            k.dealcard(a);
    }

    for(int e=1; e<=9; e++)
    {
            cout<<k.card[e]<<"("<<k.val[e]<<")"<<" ";
    }

    cout<<endl;
    system("PAUSE");
    return EXIT_SUCCESS;
}
4

5 回答 5

11

播种一次号码生成器。如果您在循环中运行您的函数,它们的执行速度将比时间分辨率间隔快(因此所有种子都相同,因此数字相同)。

在开发和调试应用程序时,如果您使用相同的已知值播种生成器,这将有所帮助。这意味着连续的调试会话将使用来自生成器的相同值。不要忘记在发布版本中切换回基于 time() 的种子(或使用预处理器检测它是调试版本还是发布版本并为您执行)。

于 2011-06-05T11:48:55.610 回答
1

尽管存在使用问题,srand()但您的卡片生成算法是错误的。即使它可能连续生成两张相同的卡片也意味着它是错误的。

你应该拿一副牌(52张或几张),使用随机生成的种子将其洗牌,然后从洗好的牌组中发牌。

于 2011-06-05T11:58:26.803 回答
1

http://www.cplusplus.com/reference/clibrary/cstdlib/srand/

srand 最好用一个唯一值初始化,例如时间,因为计算机不会生成随机数,但实际上是从 predone 列表中工作的,这将起点设置为不太可确定。

于 2011-06-05T11:42:20.683 回答
1

您不想srand每次使用时都rand调用,只需在程序开始时调用一次就可以了。

使用时间作为参数调用它还可以确保每次运行程序时都会获得不同的随机序列。

于 2011-06-05T11:44:20.357 回答
0

您正在srand()使用 null 播种;使用当前时钟时间播种,然后重试应该可以解决您的问题。

time_t now;
time(&now);
srand((unsigned int)now);
于 2011-06-05T11:42:18.963 回答