C++中的随机数

Random Numbers in C++

本文关键字:随机数 C++      更新时间:2023-10-16

我正在创建一个BlackJack程序。我希望这些牌是随机发的。如果我使用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;
}

为数字生成器设定一次种子。如果在循环中运行函数,它们的执行速度将快于时间分辨率间隔(因此所有种子都是相同的,因此数字也是相同的)。

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

请参阅http://www.cplusplus.com/reference/clibrary/cstdlib/srand/

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

您不希望每次使用rand都调用srand,只需在程序开始时调用一次即可。

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

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

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

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

time_t now;
time(&now);
srand((unsigned int)now);