2012-03-25 7 views
4

カードシャッフルアルゴリズムを書いているうちに、私は52があることに気付きました! 〜= 2^225可能なシャッフルが可能です。これを考えると、標準の32ビットまたは64ビットのシードを持つPRNGに基づくシャッフルアルゴリズムは、すべての可能なシャッフルのサブセットを生成することしかできないようです。私のプラットフォームは32ビットシードPRNG(POSIX srandom()/ random()関数のみ)を持っているので、これを創造的に使って任意の結果を生成できるシャッフルアルゴリズムを作成する方法があるのだろうかと思っていました。そうでなければ、私は自分自身を実装することができるいくつかの32ビット整数の合成であるシードを使用することができるPRNGアルゴリズムを知っていますか?52ビットデッキシャッフルの> 64ビットシードの疑似乱数ジェネレータ

+0

内部状態が226ビットを超える多くのRNGがあります。おそらく最も人気が高いのは、メルセンヌツイスターとマルサグリアxorshift +です。 –

答えて

1

現在の乱数ジェネレータを使用して問題を解決したい場合は、すべての可能なカードシャッフルのパラメータ空間をグループに分ける方法を見つけるだけで済みます。

(seed1)は、パラメータグループを定義

:あなたが唯一の1〜4とすることができるランダムシードが、12の可能な順列を有していたパラメータ空間を有する場合

例えば、次の2つのランダムシードを使用して解決します(1-4,5-8、または9-12)
(seed2)は、どの要素が最終結果であるかを定義します。

(パラメータセットは、シードサイズの偶数倍である必要はありません。これはうまくいく)

私はこの方法をソリッドステートのphy sicsモデリング。これは厳密な数学的解法ですが、最も洗練されたソフトウェア解ではないかもしれません。頑張って。

+0

完全な説明は長すぎるかもしれませんが、私は不思議です。ソリューションはなぜ機能しますか?あなたのソリューションは、同じジェネレータの乱数のペアを生成するという偽の解決策とどう違うのですか?結局、2つの異なるシードを使用しても、ジェネレータはそれほど決定的ではありませんか? (私はあなたが正しいと思っていますが、理由を学ぶことに興味があります) – thb

+0

物理学では、問題のパラメータ空間はグループに分けられました。あなたのケースでは、おそらく、それぞれのカードシャッフルオプションを、カード1が置換されていない、カード2が置換されていないというようなケースで分割します。次に、カードが置換されていない1つの乱数を生成し、あなたが望むそのグループの特定の順列があります。 これは、これがランダムを多かれ少なかれ決定的に生成するとは思わない。そして、もしそうなら、それは私が学ぶことにとって重要であろう。 – theJollySin

+0

これは原則として可能だと思います。私はこれが実際にカードをシャッフルする問題のために実際にどのように実装されるかについて考える必要があります。 – jjoelson

1

興味深い質問です。 Linuxの場合、/dev/urandom、さらには/dev/randomが適しています。これらのデバイスは、非同期ハードウェアイベントのタイミングによって供給される「エントロピープール」に依存しています。

しかし、またmrand48()cstdlibstdlib.hで提示機能を家族、 Linux上かどうかを調査します。それは48ビットを得て、それはあなたが望むものに近くなります。

幸運。

関連する問題