生成真随机数

Sax*_*owl 1 c random

我想模拟随机提供52张标准卡而不使用rand/srand urandom等...

这是我的随机数函数

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

结构我将知道卡是否已经弹出(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++;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但我的输出始终是相同的,每张卡片同时发送,所以我搜索更好的随机功能或不同的方式来填补我的交付

unw*_*ind 6

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

为了改进您的发电机,使用例如计算机的当前正常运行时间来"播种"它,这是一种经典的方式.当然,只要种子相同,它仍会产生相同的序列.

更好的解决方案是"加密安全伪随机数",这不是C的一部分,所以你必须做一些特定于平台的东西来获取一些.不确定为什么你说你不"想"使用它; 你需要得到适当的随机数.

此外,由于计算机是如此具有确定性,因此生成"真实"(或仅"好")随机数非常困难.期望你自己解决这个问题是不合理的,特别是因为(没有冒犯)你似乎对C编程很陌生.我个人在尝试推出自己的随机安全之前肯定会犹豫不决发电机.