C# 随机分发有约束的卡片

C# 随机分发有约束的卡片,c#,performance,random,probability,C#,Performance,Random,Probability,我正在开发一款纸牌游戏AI 玩家只知道自己的牌,需要随机将看不见的牌分发给对手 有些对手拥有一些牌的几率为0%,这是必须的 对手比其他人更有可能拥有一些牌,这将是一件好事,但我的主要问题是解决之前出现的情况 现在的问题是,这张牌的分发必须在很短的时间内发生很多次,所以随机分发它直到0%几率的牌不在有0%几率的对手手中是不可行的 如果我想解决这个问题,你会建议什么方法: 确保没有对手有一张他有0%几率拥有的牌,同时确保其他牌均匀分布,并且另一个对手将拥有这张牌 在一些玩家拥有10%,40%等的情况

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

玩家只知道自己的牌,需要随机将看不见的牌分发给对手

有些对手拥有一些牌的几率为0%,这是必须的

对手比其他人更有可能拥有一些牌,这将是一件好事,但我的主要问题是解决之前出现的情况

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

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

确保没有对手有一张他有0%几率拥有的牌,同时确保其他牌均匀分布,并且另一个对手将拥有这张牌

在一些玩家拥有10%,40%等的情况下。。有机会得到一张卡片

确保根据卡的重量分配卡。 一个玩家必须选择3张牌,他有2%的几率有A、K或Q,所以他不能只选择这3张牌,他可能会得到n张不同花色的高级牌

如果你能用任何语言帮助我解决第一种情况,或者给我指出一种算法,我会非常感激

谢谢

编辑:我要澄清的是,虽然有些对手可能有0%的机会拥有一张牌,但其他对手可能有正常的机会拥有它们,而且肯定会有人拥有它

EDIT2:这意味着如果我们继续随意分发卡片,我们可能只会得到最后一个玩家所要的被禁止的卡片,而这是不可能发生的

确保没有人拥有他有0%几率拥有的卡,同时确保其他卡的分配均匀 要使某些牌有0%的几率被发牌,只需将这些牌作为选项移除即可。例如

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
二,。在一些玩家拥有10%,40%等的情况下。。有机会得到一张卡片

确保根据卡的重量分配卡。一个玩家必须选择3张牌,他有2%的机会得到A、K或Q,这是他唯一可以从两套不同的牌中选择的牌

这听起来与发行版不同。您可以执行以下伪代码:

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);

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

对于1,如果你将一张“禁止”牌放入手牌,只需将其洗牌回牌组即可。 对于2,您可能可以使用类似


我想可能是相关的。

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

如果其他人对此感兴趣,则链接为:

编辑:
我最后分发了所有的牌,因为有些对手没有西服。当一个对手没有牌可供选择时,他会尝试从他没有用的牌堆中交换一张牌给另一个对手,而不是拿这张牌。作为交换,那个对手给了他一张他可以拿的牌。这不是最好的解决方案,但在99.9%的情况下有效。

如果有0%的机会拥有特定的卡,请从分发中删除该卡。您仍然可以在用户界面中声明牌组中有52张牌。但如果,比如说,其中5张牌永远不能使用,那么你真的只有47张牌在牌组中。至少,当你分发时,你从52张牌中只选择要分发的牌。类似卡片的东西。其中c=>c.概率>0@David:我编辑以澄清。这种情况是当我们知道一个对手没有指定的套装,而其他对手100%肯定有套装时分发卡片。顺便问一下,你是在使用现有的手动计算器还是自己写的?@AShelly:我没有使用手动计算器,我用ISMCTS来模拟游戏,并在游戏结束时查看最终分数。你仍然是一个评估者,可以握起手来判断谁赢了,不是吗?我更改了你第一句话中的文字,使其更加明确。第二张牌不太好用,因为我们可能只得到最后一位玩家有0%几率得到的牌,所以他不能得到。问题是我们可能只得到最后一位玩家可以选择的forbden牌。按限制性最大到最小的牌的顺序进行交易。如果牌组确实是随机洗牌的,那么给A玩家5张牌,然后给B玩家5张牌,与循环交易之间没有统计学差异。这可能是朝着正确的方向迈出的一步,但仍然有一些边缘情况下,你没有牌可发。这是一个有点难的问题!两个人可以拿两套西装,他们拿走了能拿三套西装的人需要的所有卡片,因为他们拿了太多的一套或另一套