【问题标题】:Correct logic to randomly select a card from deck until all cards are selected正确的逻辑从牌组中随机选择一张牌,直到所有牌都被选中
【发布时间】:2014-02-20 20:48:22
【问题描述】:

我在这里需要一些建议。我想创建一个逻辑,从一副牌的 52 张牌中一次随机选择一张牌,直到选择所有牌,如果使用了所有 52 张牌,我需要重新洗牌并重新开始。

我已经为此创建了一个运行良好的逻辑,但我认为应该有更好的方法来做到这一点。一些 MMM - 数学大师可以结束我的痛苦。

逻辑如下:

  1. 创建一个空数组列表来存储所有 52 张卡片以供检查
  2. 随机选择一张卡片并检查它是否存在于arraylist中
  3. 如果是,重复步骤 2
  4. 如果没有,将卡片添加到数组列表中
  5. 如果arraylist大小为52,则清空arraylist

    ArrayList<Integer> list = new ArrayList<Integer>();
    int card = -1;
    
    do {
        Random random = new Random();
        card = random.nextInt(52);
    } while (list.contains(card) == true);
    
    // code for drawing the card by the number
    list.add(card);
    

这个逻辑的唯一问题是当只剩下一张牌时,随机获得该牌的机会不到 2%。系统正在花费大量时间来查找卡。它不断检查 do while 循环。

请提出改进​​建议并感谢您抽出宝贵时间。

【问题讨论】:

  • 我看不出你的循环是如何结束的。
  • 这不是一个非常有效的解决方案,但我真的怀疑系统会花费大量时间来执行此操作。计算机非常非常快。
  • 计算机几乎和 Usain Bolt 一样快。
  • @ᴍarounᴍaroun 我觉得这个循环很好,你能指出错误吗

标签: java math random logic


【解决方案1】:

一种选择是从包含所有卡片的完整数组列表开始,然后删除随机索引,直到列表为空,此时您将重新填充它。

例子:

ArrayList<Integer> list = new ArrayList<Integer>();
for(int i=0;i<52;i++){
    list.add(i+1);
}
int c = 52;
Random random = new Random();
while(c>0){
    int r = random.nextInt(c--);
    int card = list.get(r);
    list.remove(r);
}
resetList();

【讨论】:

  • 应该是同一个 Alex,你不觉得吗?
  • 完全不一样,这个逻辑没有重试。 +1
  • 在这种情况下,您不需要检查卡是否在列表中。
  • @Alex 可以,你用一些代码解释一下?我想我没有正确理解你。
  • @Alex 谢谢,我不这么认为,真的很好。
【解决方案2】:

以随机顺序从牌堆中抽牌与洗牌然后从第一张到最后一张抽牌相同。因此,您可能会发现 Shuffling a deck of cards 很有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-01
    • 2022-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多