生成可赢得的单人纸牌游戏,其随机性相当于改组

时间:2013-09-17 21:45:57

标签: algorithm random shuffle

如果给你:

  1. 一个很好的改组算法(一个很好的随机性来源加上一个改组的方法,不受任何会导致结果偏差的常见陷阱)
  2. 一个魔术函数WINNABLE(D),如果牌D可以通过某些游戏序列获胜,则返回True并返回True;如果不可避免地导致失败位置,则返回False。
  3. 然后,通过生成一组大的起始牌组(1),然后将它们过滤到带有(2)的winnable组,可以生成一组“分布均匀”的可赢牌纸牌交易。这种随机生成可能性并从中挑选的方法总是一个很好的起点,当你试图避免微妙的选择偏差蔓延到你的结果时。

    这个问题是(2)很难(可能是NP-hard取决于游戏),甚至它的近似值在计算上也很昂贵(如果你在iPad上,比如说)。然而,更便宜的算法,例如从获胜位置开始并随机“不动”以将游戏反转回起点可能会对特定的牌组改组产生偏差,而这些改组很难量化或避免。

    在生成这样的可赢游戏领域是否有任何有趣的算法或研究?

2 个答案:

答案 0 :(得分:0)

由于纸牌游戏的差异很大,因此很难在这种普遍性水平上进行推理。为了集中我们的想法,让我们举一个具体的例子:四十个盗贼。这是一个双重包装游戏,从空基础开始,要向上制造。空的废料堆;以及十张正面朝上的筹码堆,每张四张牌。废物堆和布局堆的顶部卡片被暴露。每一步,您都可以:

  1. 将裸露的卡片移动到基金会中的合法位置,不用担心 背部;
  2. 将裸露的卡片移到布局中的一堆上,仅当 穿着同一套西装向下走;
  3. 将裸露的卡片移动到空白的版位;
  4. 将卡片从库存交易到废物的顶端。

初学者按照规定的顺序播放这些选项。 (我所玩的实现实际上有一个提示按钮,提示相应地采取了相应的行动。)我估计该策略可赢得的交易少于十分之一,而可赢得交易的实际比例约为三分之一。

现在,如果您通过随机不动产生可赢的交易,则存在难以量化的偏差;我不同意这一点。不过,我认为,在碰巧可以赢得交易的交易中,交易往往会比平均水平更难,而初学者的策略几乎不会赢得任何交易。

但是,您可以故意将不动产设为非随机。如果您以与初学者的策略相反的顺序选择不动产,则会获得一笔交易,该交易适用于初学者的策略:例如如果仅是万不得已,那么您就从地基转移到浪费,那么只要有可能,从废物转移到地基永远是正确的。

答案 1 :(得分:-2)

嗯,我对Solitaire了解不多,但这就是我解决这个问题的方法。看我的伪代码。

//假设您已经创建了一个“卡片”对象。

Generate a List<Cards> deck;// A list populated with every card in deck that you can use in Solitaire with the number of each card you can use in Solitaire.
Generate a List<Cards> table;
while(deck.size()>0){//This is the real code.
     table.add(deck.remove((int)(Math.random()*deck.size())));
}
//And done. You know have a perfectly shuffled list of Cards in table.
//Now divide the list up however you want.

我不知道第2部分。