フリーセル ゲーム番号からカード配列を求めるアルゴリズム

  1. 52個の整数配列「デッキ」を確保し0~51の値を順番にセット
  2. 横8列×縦21段の二次元整数配列を確保してすべての要素に空を示す-1をセット
  3. ゲーム番号を srand() に渡し乱数系列を初期化
  4. 残り枚数」に52をセット
  5. カウンタ」を0から51まで1ずつ増やしながら下記6~9を52回繰り返す
  6. rand() を一回呼び、取得した乱数を「残り枚数」で割った余り j を求める
  7. 二次元配列の [カウンタ % 8] 列目の [カウンタ / 8] 段目にデッキの [ j ] 番目の値を移す
  8. 使ってしまったデッキの [ j ] 番目にはデッキの最後のカード( [残り枚数-1] 番目)を移す
  9. 残り枚数から1を引く

これで8列のフリーセルの初期カード配列が二次元配列に入る。二次元配列要素に入っている0~51の値の意味は以下のとおり

0=A♣ 1=A♦ 2=A♥ 3=A♠
4=2♣ 5=2♦ 6=2♥ 7=2♠

48=K♣ 49=K♦ 50=K♥ 51=K♠

srand() と rand() はMS-C互換である必要がある。他の処理系で実装するには例えば以下のようなコードが必要

class MRand
{
    private int holder = 1;
    public void srand(int seed)
    {
       holder = seed;
    }
    public int rand()
    {
        holder = ((holder + 10) << 18) - holder * 48131 - 90429;
        return (holder << 1) >>> 17;
    }
}

マイナスのゲーム番号のカード配列はこのアルゴリズムとは無関係