随机分配带有约束的卡片

时间:2014-03-03 20:01:57

标签: c# performance random probability

我正在开发一款纸牌游戏AI。

玩家只知道它的牌并需要将看不见的牌随机分发给对手。

有些对手有0%的机会获得一些牌(这是必须的)。

对手比其他人更有可能拥有一些牌(这会很好,但我的主要问题是解决之前提出的情况)。

现在的问题是这张卡的分发必须在很短的时间内发生很多次,所以随机分发它,直到0%的机会卡不在有0%几率的对手的手中是不可行的。

如果我想解决这个问题,你会建议采用什么方法:

  1. 确保没有对手有一张他有0%几率的牌,同时确保其他牌均匀分布(另一个对手将拥有此牌)

  2. (在某些玩家有10%,40%等情况下有卡的机会)

    确保根据卡的重量对卡进行分配。 例如:一个玩家必须选择3张牌,他有2%的几率获得A,K或Q所以他不仅可以选择3张牌(他可能最终得到不同套牌的n张不同牌)

  3. 如果你能帮助我解决1号情况(用任何语言,或指向我的算法),我真的会对它进行解释。

    谢谢!

    编辑:我应该澄清,虽然有些对手可能有0%的机会拥有一张牌,但其他对手可能有正常的机会(有人肯定会有)。

    EDIT2:这意味着如果我们继续随意分发卡片,我们可能最终只能获得最后一位玩家的禁牌(这不会发生)。

3 个答案:

答案 0 :(得分:1)

对于#1,如果您处理“禁止”'把牌塞进一只手里,把它洗回到牌组里 对于#2,您可以使用类似"Cumulative Distribution Function"

的内容

我认为this question可能是相关的。

答案 1 :(得分:0)

  
      
  1. 确保没有人有一张卡片,他有0%的机会拥有,同时确保其他人均匀分发
  2.   

要使某些牌有0%的机会被处理,只需将这些牌作为选项删除即可。 E.g。

IList<int> cardOptions = Enumerable.Range(1, 52).ToList();
// all 52 cards in this deck represented as integers
// remove some:
cardOptions.Remove(5);
cardOptions.Remove(42);
// when you randomly select from cardOptions,
// each remaining card has a 1/50 probability of being chosen
  

2 (在一些玩家有10%,40%等等的情况下,有一张卡的机会)

     

确保根据卡的重量对卡进行分配。例如:一名球员必须选择3张牌,他有2%的几率获得A,K或Q,这是他唯一可以选择的牌(来自2种不同的牌)

这听起来与typical weighted random发行版不同。您可以执行以下操作(伪代码):

double probabilityOfHavingCertainCard = 0.4;
int thatCard = 52;
if (randomDoubleBetween0and1 < probabilityOfHavingCertainCard)
    cardResults.Add(thatCard);

cardOptions.Remove(thatCard);
while (cardResults.Count < 5)
    cardResults.Add(random from cardOptions, not previously chosen);

也就是说,它将加权卡视为一种特殊情况,而不是普通洗手的一部分。

答案 2 :(得分:0)

我在另一个网站上发现了一个类似的问题,但实际上并没有得到如何解决我问题的简单部分的答案。

如果有其他人感兴趣,链接是:

https://math.stackexchange.com/questions/220606/n-piles-of-hidden-cards-of-known-marginal-probability-distribution-then-a-card

编辑: 我最终使用一些没有穿西装的对手的限制来分发所有牌。当一个对手没有牌时,他可以选择从他试图换掉一张牌,而这个牌对于另一个对手没有用,而不是拿这张牌。作为对手的对手给了他一张他可以拿走的牌。它不是最好的解决方案,但99.9%的时间都有效。