【问题标题】:Randomly select objects once from deck of cards从纸牌中随机选择一次对象
【发布时间】:2020-07-03 04:13:58
【问题描述】:

我很确定我的余数运算符在错误的位置,我尝试了几种不同的变体,程序仍然运行但不止一次拉同一张卡:

Card [] deck = {card0, card1, card2, card3, card4, card5, card6, card7, card8, card9, card10, card11, card12, card13,
        card14, card15, card16, card17, card18, card19, card20, card21, card22, card23, card24, card25, card26, card27, card28,
            card29, card30, card31, card32, card33, card34, card35, card36, card37, card38, card39, card40, card41, card42, card43,
            card44, card45, card46, card47, card48, card49, card50, card51,
        };
for (int i = 0; i<deck.length;i++){
    deck[i] = deck[i%51];
    }
for (int i = 0; i<deck.length; i++){
    index = (int)(Math.random()*deck.length);
    deck[index] = deck[i];

    System.out.println(deck[i] + " ");

    }

我知道这套牌并不是以最有效的方式创建的,这是由于任务的限制。我只包含了一小部分代码,因为我认为问题在于我的 for 循环和余数运算符。

【问题讨论】:

  • i%51 是每次迭代的常数
  • 请解释你的程序应该做什么,然后第一个for循环应该做什么,然后第二个for循环应该做什么。
  • deck[0]=deck[0%51] and deck[1]=deck[1%51] 等等
  • 如果在第二个循环的多次迭代中得到相同的 index 值会发生什么?您的输出牌组将比原始牌组短。

标签: java arrays random


【解决方案1】:

诀窍是随机洗牌,然后按洗牌顺序输出。

看看Collections.shuffle

【讨论】:

    【解决方案2】:

    不确定您要在这里做什么,因为在这种情况下 i%51 始终等于 i

    for (int i = 0; i<deck.length;i++){
        deck[i] = deck[i%51];
        }
    

    现在要生成一个介于 0 到 50 之间的随机数,您需要类似

    int randomInt = (int)(50.0 * Math.random());
    

    因此你应该使用:

    for (int i = 0; i<deck.length; i++){
        index = (int)((deck.length-1) * Math.random());
        System.out.println(deck[index] + " ");
        }
    

    但请确保,使用此方法可能会看到一些重复项。如果您希望每张卡片仅被绘制/显示一次,请使用 Collections.shuffle(..)

    List<Card> deckList = Arrays.asList(deck);
    Collections.shuffle(deckList);
    for(Card card : deckList){
      System.out.println(card);
    }
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-06-10
      • 1970-01-01
      • 2021-03-17
      • 1970-01-01
      • 1970-01-01
      • 2011-02-01
      • 2015-07-15
      • 2012-11-01
      相关资源
      最近更新 更多