【问题标题】:How do you shuffle a non-standard deck of cards?你如何洗牌非标准的一副牌?
【发布时间】:2012-05-26 20:41:54
【问题描述】:

我正在制作一个玩 UNO 游戏的程序。在 UNO 牌组中,有些牌是重复的,因此我不能只列出整数列表;我必须使用对象。我计划在牌组中使用 LinkedList,但我知道 LinkedList 上的洗牌速度非常慢。

我的问题是,我应该......

  1. 完全避免使用 LinkedList,只使用 ArrayList
  2. 使用 ArrayList 或类似的,随机播放,然后将内容放入 LinkedList
  3. 构造一个 ArrayList,然后制作我自己的 shuffle 例程(也就是不使用 Random),在我们进行时添加到 LinkedList 中
  4. 不管怎样洗牌 LinkedList(就像这样,它并没有那么糟糕)

这不是作业;这是为了帮助玩得开心:)

【问题讨论】:

  • 为什么要使用 LinkedList 作为一副纸牌?为什么不直接使用 ArrayList 作为卡片组?
  • 因为你需要抽第一张牌,然后把牌加到最下面。 LinkedLists 很酷。
  • 我会完全避免使用链表。使用 get/set first/last 也是 np 与任何其他数据类型。而且由于您需要洗牌,所以链表只满足一个要求
  • 我只是打乱了一个链表和一个数组列表,链表用了 42 毫秒,数组列表用了 27 毫秒(每个都有 200000 个元素)。单副或双副牌都显示 0ms。
  • 您可能想阅读 Jeff Atwood 的这篇文章:codinghorror.com/blog/2007/12/shuffling.html

标签: java


【解决方案1】:

如果你不经常洗牌,它不会那么慢。

洗牌的一种方法是随机排列第一张牌和另一张牌。这不是 LinkedList 慢。另一方面,将其复制到 ArrayList 或从 ArrayList 复制需要一些时间。

【讨论】:

  • 转储到数组、排序和转储回链表比使用链表排序要快得多。以至于java.util.Collections.sort(List) 中的默认实现转储到一个数组进行排序。
  • 通过避免复制数据而不转储到数组甚至更快。 “将第一张卡片与另一张卡片置换”我同意是正确的“洗牌”步骤,但是在固定大小的数组中交换两个插槽比弄乱链表代码更少,速度更快。而且您甚至可能在第一次尝试时就正确编码。
【解决方案2】:

您可以用纯整数表示卡片。如果一个整数代表一种卡牌,而Uno拥有多张同种卡牌,那么只要多次使用该卡牌对应的整数即可。

洗牌和交易很容易。

要开始游戏,请设置一个固定大小的哑整数类型数组(无需应用花哨的链表或 Arraylist),它可以容纳整个牌组(大小 = N)。用表示 Uno 牌组的整数填充此数组,包括表示重复卡片的重复整数。将 UNDEALT 设置为 N。

要随机播放,请执行以下代码适度(100?)次:

 1)  Pick a random number from 1 to UNDEALT, R.
 2)  Exchange the the first array slot with the Rth slot.

交易:

 1) Give out the card in the UNDEALT slot.
 2) Decrement UNDEALT.

您也可以使用更高级的数据结构来完成所有这些工作,但没有任何意义。鉴于所涉及的总信息是 100 个数据项,除非你做一些非常愚蠢的事情,否则它会比人快。但我的座右铭是:如果简单有效,就坚持简单。

【讨论】:

    【解决方案3】:

    一些想法:

    cards[] = {1, 1, 1, 1, 2, 3, 4, 5, 6, 6},其中 1 = "Wild",2 = "Draw Four",或者你有什么。

    在我看来,使用 Array(List) 会更容易做到这一点。这里的区别在于使用数组的 values 进行游戏,而不是使用它们的 keys 来确定卡片是什么。

    如果你愿意,你可以对对象做同样的事情;您根据数组索引对数组进行洗牌,但使用数组中的值(表示卡片的对象)来了解卡片的实际含义。

    edit:显然Java会为你洗牌! http://docs.oracle.com/javase/6/docs/api/java/util/Collections.html#shuffle(java.util.List)

    【讨论】:

    • 我们不是在谈论任意删除;仅从列表顶部删除。此外,您的最后两段令人困惑,只是重复了应该相当明显的事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-25
    • 1970-01-01
    • 2022-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多