12 ポイント 投稿者 regentag 2024-10-25 | 8件のコメント | WhatsAppで共有

多くの方がプレイしたことのあるWindowsのFreeCellは、カードをランダムに並べ、それぞれのカード配置に番号が付いています。同じ番号を選ぶと、同一のカード配置になります。

Windows 2000以前までは1〜32,000番まででしたが、XP以降は1,000,000番までに増えました。

番号を入力したときにカード配置を生成するアルゴリズムは公開されており、ほかのFreeCellプログラムでも使われています。

このアルゴリズムは短いCコードで実装されており、MSのコンパイラで実装された rand() 関数と srand() 関数に依存しています.

8件のコメント

 
valorqueen 2024-10-25

タグ兄さん、お上手ですね

 
qdr7h 2024-10-25

本来、乱数生成アルゴリズムは random に見えても、実際にはそうではない pseudo-random number の数列を生成する漸化式を使います。各 rand() 関数の実装ごとに方式は異なりますが、最初の seed が同じなら、その後に続く乱数列が同一になることは、ほぼすべてのアルゴリズムに共通する特性です。したがって、カード配列アルゴリズムが deterministic であるなら、すべてのカード配列は seed によって deterministic に決まるわけです。

少し話が脱線しますが、どれだけランダムに見える pseudo-random number を生成できるかという点も、長年にわたる研究テーマの一つでした。TAOCP Vol.2 でもこの内容が簡単に扱われています。

 
kandk 2024-10-25

実際、コンピューターには真のランダムという概念はありません。
そのため、通常は人の行動をms単位で測定し、これをランダム seed として使います。

 
dlehals2 2024-10-25

乱数は現在時刻のタイムスタンプを使っているものだと思っていましたが、勘違いしていましたね(笑)。共有ありがとうございます。

 
regentag 2024-10-25

初期化するときに seed として時間を使うことはよくありますよね。時間は常に変化していますから。

 
regentag 2024-10-25

ちなみに、Windowsのヘルプには「証明はされていないが、ここでプレイするゲームにはすべて解法がある」と書かれていますが、複数の人の試みによれば、11982番はいまのところクリア不可能だと知られています。

32,000番以降にも、146692、186216、455889、495505、512118、517776、781948番など、クリア不可能だと知られているカード配置があります。

 
namojo 2024-10-28

いや、これをどうやって書き留めておいて解けないのか突き止めたんでしょう? すごい執念のある人が多いですね!

 
bakyeono 2024-10-25

怖い人たち……!