Optimization 模拟纸牌游戏。堕落的诉讼

Optimization 模拟纸牌游戏。堕落的诉讼,optimization,combinations,mathematical-optimization,Optimization,Combinations,Mathematical Optimization,这可能是一个有点神秘的标题,但我有一个非常具体的问题。首先是我的当前设置 也就是说,在我的卡模拟器中,我以8张一组的方式向4名玩家发32张卡。所以每个玩家8张牌。 配4套标准套装(黑桃、黑桃等) 我当前的实现周期抛出了32个中8个的所有组合 巫婆给了我很多可能性。 也就是说,第一个玩家可以有10518300手不同的牌。 第二张牌可以由735471手不同的牌来处理。 第三名玩家则有12870只不同的手。 最后第四个只能有1个 给我总共9.9561092e+16种不同的独特方式来处理一副32张牌给4

这可能是一个有点神秘的标题,但我有一个非常具体的问题。首先是我的当前设置

也就是说,在我的卡模拟器中,我以8张一组的方式向4名玩家发32张卡。所以每个玩家8张牌。 配4套标准套装(黑桃、黑桃等) 我当前的实现周期抛出了32个中8个的所有组合 巫婆给了我很多可能性。 也就是说,第一个玩家可以有10518300手不同的牌。 第二张牌可以由735471手不同的牌来处理。 第三名玩家则有12870只不同的手。 最后第四个只能有1个 给我总共9.9561092e+16种不同的独特方式来处理一副32张牌给4个玩家。如果卡的顺序不重要

在4GHz处理器上,即使每种可能性只有1个刻度,我也需要半年的时间

不过,我想通过交换钻石、黑桃和黑桃来简化这种纸牌交易。这意味着向玩家1发8个黑桃相当于发8个黑桃。(请注意,这不适用于俱乐部)

我正在寻找一种方法来产生这个。因为这将使第一手的可能性至少减少6倍。我当前的实现是在C++中。 但请随意用不同的语言回答

/**http://stackoverflow.com/a/9331125 */
无符号cjasMain::nChoosek(无符号n,无符号k)
{
//断言(kn)返回0;
如果(k*2>n)k=n-k;
如果(k==0)返回1;
int结果=n;
对于(int i=2;i 0);
int i,p,k=0;
对于(i=0;i=r,“误差n需要大于r”);
std::向量v(n);
std::fill(v.begin()+r,v.end(),true);
做
{
对于(int i=0;i你想做什么?为什么你需要生成每一个可能的组合?试图确定可能的最佳移动以及平均点数。这不是一个零和游戏,奖金点数允许可变点数。有一个变化,其中一个可能性超过平均点数的5倍。或者可能是n也许我不太明白,你是需要为一手牌找到最好的招式,还是需要找到一手牌可以获得尽可能好的分数?@WilQu我觉得没有另一手牌你是找不到的。