列举所有扑克头对头

时间:2012-12-17 23:23:56

标签: combinations probability poker

Hold'em中有52C2 * 50C2 / 2 = 812175个可能的头对头匹配。假设每张卡都有一个阵列,我怎么能列举所有这些比赛?

例如,列举所有可能的起手牌是:

for (int a = 0; a < 51; ++a) {
  for (int b = a + 1; b < 52; ++b) {
    println(cards[a] + "," + cards[b]);
  }
}

我的训练可以让所有的比赛增加两次(得到As,Ah vs Kc,Kd和Kc,Kd vs As,Ah):

long total = 0;
for (int a = 0; a < 51; ++a) {
  for (int b = a + 1; b < 52; ++b) {
    for (int c = 0; c < 51; ++c) {
      for (int d = c + 1; d < 52; ++d) {
        total++;
      }
    }
  }
}

1 个答案:

答案 0 :(得分:0)

您的代码打印出正确的结果,但不会正确迭代所有卡片。 ac应该循环到52。需要使用if语句删除额外的牌:

for (int a = 0; a < 52; ++a) {
  for (int b = a + 1; b < 52; ++b) {
    for (int c = 0; c < 52; ++c) {
      for (int d = c + 1; d < 52; ++d) {
        if (c != a && c != b && d != a && d != b) {
          total++;
        }
      }
    }
  }
}

然后可以修改它以消除重复的手:

for (int a = 0; a < 52; ++a) {
  for (int b = a + 1; b < 52; ++b) {
    for (int c = a + 1; c < 52; ++c) {
      for (int d = c + 1; d < 52; ++d) {
        if (c != b && d != b) {
          total++;
        }
      }
    }
  }
}