【问题标题】:Random Numbers in C++C++ 中的随机数
【发布时间】:2011-09-08 17:12:44
【问题描述】:

我正在创建一个二十一点计划。我希望随机发牌。如果我使用 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;
}

【问题讨论】:

  • 在上面的代码中,你有srand(),我认为它甚至不会编译。你真的怎么称呼它?
  • srand() 用于播种 rand 函数。

标签: c++ class random numbers blackjack


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 嗯,是的。它有点工作,但它增加了不必要的延迟
      【解决方案4】:

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

      你应该拿一副牌(52 或多个),shuffle 使用随机生成的种子,然后从洗好的牌中发牌。

      【讨论】:

      • 我打算稍后再添加。但这仍然留下了“随机种子”的问题。我计划添加一个函数来检查同一张牌是否已经发过,如果它返回再发另一张。
      【解决方案5】:

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

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

      【讨论】:

      • srand() 甚至没有编译,所以 OP 没有给我们正确的代码。这个答案可能是正确的,但他/她已经说他/她正在做srand(time(NULL))
      • 在VS2010下不编译,在GCC 4.1.2下也不行!另请参阅cplusplus.com/reference/clibrary/cstdlib/srand
      猜你喜欢
      • 1970-01-01
      • 2011-01-27
      • 2011-11-07
      • 1970-01-01
      • 1970-01-01
      • 2014-04-27
      • 2018-11-19
      • 1970-01-01
      相关资源
      最近更新 更多