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 に答える