1

我想在不使用 rand/srand urandom 等的情况下模拟随机交付 52 张标准卡...

这是我的随机数函数

int rand2(int lim)
{
  static int a = 34;  // could be made the seed value                                                            
  a = (a * 32719 + 3) % 32749;
  return ((a % lim) + 1);
}

我会知道卡片是否已经弹出的结构(0 = 否,1 是)

typedef struct          s_game
{
  int                   *cards;
  int                   state;
  unsigned int          dat_rand;
}                       t_game;

int             main()
{
  t_game        game;
  int           i;
  int           rd;

  i = 0;
  game.cards = malloc(sizeof(*game.cards) * 52);
  while(i < 52)
    {
      rd = rand2(52);
      if(game.cards[rd] == 0)
        {
          game.cards[rd] = 1;
          printf("i:%d\n rd: %d\n", i, rd);
          i++;
        }
    }
}

但是我的输出总是一样的,每张卡片都是同时交付的,所以我正在寻找更好的随机函数或不同的方式来填充我的交付

4

1 回答 1

6

当然,您的数字序列将始终相同,计算机在此级别上具有极高的确定性。

为了改进您的生成器,使用例如计算机的当前正常运行时间“播种”它,这是一种经典方式。当然,只要种子相同,它仍然会生成相同的序列。

更好的解决方法是“加密安全的伪随机数”,它不是 C 的一部分,所以你必须做一些特定于平台的事情来掌握一些。不知道你为什么说你“不想”使用它;你必须得到正确的随机数。

此外,由于计算机是如此确定性,因此生成“真实”(或只是“好”)随机数非常困难。期望您自己解决它是不合理的,特别是因为(无意冒犯)您似乎对 C 编程很陌生。就我个人而言,在尝试推出自己的安全随机数之前,我肯定会犹豫很长时间发电机。

于 2013-09-30T09:14:13.447 回答