配列を反復処理する必要のヘルプは、ポーカーAIのための2つの可能性、ノー繰り返しを取得します

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

質問

私は本当に言葉に良い方法でこの質問、また良いタイトルを考えることはできません、そしておそらく答えは、私はそれをしないのですように途方もなく簡単です。私はポーカーAIに取り組んでいます、と私はより良い私よりある存在の手の数を計算します。私はそれをどのように理解し、しかし、私が把握することはできませんと、カードのグループを反復処理するための最良の方法です。

私はフロップでいますので、私は私の2枚のカードが何であるかを知っている、と3枚のカードがボード上にあります。以前にAを計算しているのであれば、あなたはそこに47枚の未知のカードがあると私はあなたが同じランクとスーツの2枚のカードを持つことができないように、2つは、アウト渡されることを想定したもの47枚のカードのすべての可能な組み合わせを反復処理したい、と私は時間を無駄にされますので、あなたは、再びそれを超える行うにはしたくない、これは何度も呼び出されます設定します。あなたが理解していない場合は、私が教えてください、私はより明確にしてください求めていたいです。だから、私はその要素が1に等しい場合、それは、それは私の手ではなくボード上にないことを意味し、各訴訟のための4、および各ランクのための13、このような何かを設定することができます。 。 setOfCards[4][13]

私はこのようなループのための簡単なセットを行う場合は、次の(擬似コード)を

//remove cards I know are in play from setOfCards by setting values to zero
for(int i = 0; i < 4; i++)
    for(int j = 0; j < 13; j++)
        for(int k = 0; k < 4; k++)
            for(int l = 0; l < 4; l++)
                //skip if values equal zero
                card1 = setOfCards[i][j]
                card2 = setOfCards[k][l]
                //now compare card1, card2 and set of board cards

だから、これは実際には、たとえば、多くの値を繰り返すように起こっている:カード1 = AceOfHearts、カード2 = KingOfHeartsはカード1 = KingOfHearts、カード2 = AceOfHeartsと同じです。また、私の計算を変更します。どのように私はこれを避けて行くべきですか?また、この技術の名前はありますか?ありがとうございます。

役に立ちましたか?

解決

あなたが

と言うことができ、ちょうど52枚のカードののシングルの配列を持つことが容易になるだろう
for (int i=0; i<52; i++)
    for (int j=i+1; j<52; j++)
あなたは何の繰り返しを取得していないので、

jは常に、iよりも高くなります。あなたは、2次元配列についても同様のことを行うことができますが、それはビットトリッキーです:

for (int k=i; ...) 
    for (int l=j+1; ...)
内側の2つのループで

はそれを行うべきです。

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