コレクションはポーカーアルゴリズムに適していますか?

StackOverflow https://stackoverflow.com/questions/2715423

  •  01-10-2019
  •  | 
  •  

質問

Javaには、使用するポーカーシステムがあります Collections.shuffle() カードが配られる前のすべての利用可能なカードで。

したがって、52枚のカード2-9、J、Q、K、A 4種類のコレクション。

その後、私たち Collections.shuffle().

問題は、それが(今まで大きな統計を持っていなかったようで、多くの統計的推論しか見られない可能性がある)ということです。アルゴリズムが非常に不明確であることです。

だから、そうです Collections.shuffle() ポーカーアルゴリズムは大丈夫ですか?


コメントへの回答:「不明確に」ということで、いつかは非常に謎に富んでいるということです。多くのユーザーは、「ライブ /他のポーカールームと同じではない」について不満を述べています。私はこのシステムで多くをプレイしましたが、2000歳未満の3つのロイヤルフラッシュがこのシステムで3つのロイヤルフラッシュをプレイし、100.000を超えるポーカールームで3つのロイヤルフラッシュをプレイし、今日まで2つを見ることができます。

役に立ちましたか?

解決

これが真剣なポーカーアプリケーションであり、お金が手を変えることができる場合、短い答えはノーです。このようなもののために、真のランダム性のハードウェアソースを実際に使用する必要があります。

少し長い答えは次のとおりです。真のランダム性を実行するためにハードウェアを取得できない場合、 Collections.shuffle(List, Random) そうかもしれない あなたが供給するならば、十分に良くなります SecureRandom. 。このソリューションのトリッキーな部分は、良い種子の価値を見つけることです。

更新:説明に基づいて、PRNGのシード方法を調べることをお勧めします(暗号化された安全な実装をすでに使用していると仮定します。そうでない場合は、最初に行います)。あなたがすべき いいえ 限られた種子のセットを使用しています。考慮すべきその他のこと:

  • おそらく各ゲームに1つのPRNGをインスタンス化する必要があります
  • デッキを手の間でシャッフルするだけです。あなたの質問から、あなたがフロップ、ターン、川などの間のデッキをシャッフルしていないことは100%明確ではありません。

他のヒント

Collection.shuffle のo(n)実装を使用します Fisher-Jatesシャッフルアルゴリズム.

ランダムインデックスは通常のJavaのPRNGで選択されるため、ほぼ均一になります。デッキのすべてのシャッフルは、他のすべてのものと同じくらい可能です。

これはあなたがやりたいことにとって非常に問題ありませんが、実際のランダム化が必要な場合は、いくつかの実際のランダムな要因を導入する必要があります( System.currentTimeMillis() 乱数ジェネレーターをシードするために使用されます)または特殊なハードウェアのようなよりリアル可能なもの。

わかりました、私は一般的に私にこれを言っている人が嫌いですが、はい、いいえ。 PickRandomCardbetwene(1、52)と同じくらい大丈夫で、ランダム性に関してはrand()関数を使用します。

部分は、適切なハードウェアが必要なチャンスやランダムな値を扱うものについては、通常のコンピューターは、あらゆる種類の真にランダムな結果をリモートで生成することさえできないということです。

編集:PokerSystemが楽しみのためにプレイするためのものである場合、それは一つのことですが、お金が関係する場合、人々はそのようにランダムな結果を作成するためにあなたを悩ませます。

この記事を読むことをお勧めします:

オンラインポーカーでチートすることをどのように学んだか

著者は1つのソフトウェアパッケージを見て、いくつかの欠陥を見つけました。 1つの深刻な問題は種でした。 32ビットシードから始めて(シャッフル中に新しい独立した種子を生成しない)場合、2^32の異なるランダムシーケンスのみを生成できます。 52カードデッキには2^226のシャッフルがあります。これは、可能なデッキ注文のごく一部のみが生成されることを意味します。

プレーヤーは、フロップで5つのカードポジション(オマハの7)を知っています。プレイヤーがシャッフルアルゴリズムを知っている場合、候補シードが見たカードに基づいているものを推測できます。これにより、隠されたカードが何であるかの確率を推測する上で、彼は大きな利点をもたらします。

これがお金を含む深刻なポーカーソフトウェアである場合、答えはノーです。 (このためには、真のランダム性の何らかの原因が必要です。)ただし、単純な状況では、他のアルゴリズムと同じくらい良い解決策です。

シャッフルアルゴリズム自体の詳細情報が必要な場合は、 JavaのCollections.shuffleは何をしていますか?.

問題は、ランダムによって生成された数値が統計的にランダムであることです。これは、シャッフルが実際のデッキシャッフルよりもランダムであるため、カードのデッキのように振る舞わないことを意味します。より現実的なものを手に入れるには、実際の生活の中でカードをシャッフルする方法をシミュレートする必要があります。実際のサイコロとコンピューターの結果が生成された結果を比較したチャートのサイトを見ました。コンピューターの結果はより均等に配布されていましたが、Googleでリンクを見つけることができないようです。

これは、大規模なポーカーサイトがどのように行うかではないことを伝えることができます。デッキを事前にシャッフルすると、カードシーケンスがゲームサーバーのメモリでどこかで使用可能になります。つまり、サーバーホスト(OPSが持っているように)にアクセスできる場合は、読み取ることができます。代わりに、必要なときはいつでもカードがデッキからランダムに選ばれます(ハードウェアRNGの上にセキュアランダムを使用します)。 「間違った」コミュニティカードを取得すると、これは時々あなたの心を台無しにします。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top