【问题标题】:Java: Shuffle Deck using math.random()Java:使用 math.random() 洗牌
【发布时间】:2020-12-02 20:10:27
【问题描述】:

我有一个基于生成一副牌然后洗牌的代码。这是我目前的代码。

import java.lang.Math;
import java.util.Arrays;


public class Program_9 {
    public static void main(String[] args) {            
        int[] deck = new int[36];
        int n = 1;
        
    initDeck(deck);
    
    System.out.println("\nDeck");
    System.out.println("#############\n");
    
    displayDeck(deck);
    
    System.out.println("\nShuffled Deck");
    System.out.println("#############\n");
    
    shuffleDeck(deck, 10);
    
    
    
}

public static int cardValue(int card) {
    //Return the integers value 1 - 9 of card
    
    int cardValue = card % 9 + 1;
    
    return cardValue;
}

public static String cardSuit(int card) {
    //return the suit club, spade, heart, diamond of card   
    
    String cardSuit = "";
    int value = card / 9;
    
    if (value == 0) {
        cardSuit = "Club";
    }
    
    if (value == 1) {
        cardSuit = "Spade";
    }
    
    if (value == 2) {
        cardSuit = "Heart";
    }
    
    if (value == 3) {
        cardSuit = "Diamond";
    }
    
    return cardSuit;        
}

public static void displayCard(int card) {
    //prints card value and suit in some reasonable report
    System.out.print(cardValue(card) + " of " + cardSuit(card));
    
}

public static void initDeck(int[] deck) {
    //assign the elements of deck, such that each elements value is the same as it index
    
    deck[0] = 1;
    deck[1] = 2;
    deck[2] = 3;
    deck[3] = 4;    
    deck[4] = 5;
    deck[5] = 6;
    deck[6] = 7;
    deck[7] = 8;
    deck[8] = 9;
    deck[9] = 10;
    deck[10] = 11;
    deck[11] = 12;
    deck[12] = 13;
    deck[13] = 14;
    deck[14] = 15;
    deck[15] = 16;
    deck[16] = 17;
    deck[17] = 18;
    deck[18] = 19;
    deck[19] = 20;
    deck[20] = 21;
    deck[21] = 22;
    deck[22] = 23;
    deck[23] = 24;
    deck[24] = 25;
    deck[25] = 26;
    deck[26] = 27;
    deck[27] = 28;
    deck[28] = 29;
    deck[29] = 30;
    deck[30] = 31;
    deck[31] = 32;
    deck[32] = 33;
    deck[33] = 34;
    deck[34] = 35;
    deck[35] = 36;

}



public static void shuffleDeck(int[] deck, int n) {
    //the following performed exactly n times:
    // 1. generate two random numbers j and k - each in range of [0 , 35]
    // 2. swap the values of the deck array at indices j and k
    
    for (int i = 0; i < deck.length; i++) {
        
        int k = (int)((Math.random() * 35) + 0);
        int j = (int)((Math.random() * 35) + 0);
        
        
        
    }
}

public static void displayDeck(int[] deck) {
    //prints the cards in deck in some reasonable report format
    
    for (int i = 0; i < deck.length; ++i) {
        int card = i;
        
        displayCard(card);
        System.out.println();
        
    }
    
    
}

}

我在理解如何编写 shuffleDeck() 方法时遇到问题。这是我第一次学习 Java,所以我还很新。我不明白的是 shuffleDeck() 方法中的第二个推荐。 请注意,这是一项家庭作业,因此我希望提供提示而不是答案

【问题讨论】:

  • 你也可以在codereview.stackexchange.com
  • 你是如何创建套牌的?
  • 将您的卡片添加到 ArrayList。然后使用 Collections.shuffle(...) 方法洗牌。
  • @iota 还有 2 种其他方法可用于确定套件和卡片的价值。

标签: java arrays for-loop


【解决方案1】:

这是我周围的一些代码。

    char[] someArray= ...;
    
    //shuffle it up
    for (int i = 0; i < someArray.length; i++) {
        int randomPosition = rand.nextInt(someArray.length);
        char temp = someArray[i];
        someArray[i] = someArray[randomPosition];
        someArray[randomPosition] = temp;
    } 

我基本上会遍历数组中的所有位置,并与数组中的随机位置进行交换。

【讨论】:

    【解决方案2】:

    这就是洗牌数组所需要做的一切。

    int a[] = IntStream.range(0, 36).toArray();
    System.out.println("New deck");
    display(a);
    shuffleDeck(a);
    System.out.println("\nShuffled deck");
    display(a);
    

    打印

    New deck
    1C 2C 3C 4C 5C 6C 7C 8C 9C 
    1D 2D 3D 4D 5D 6D 7D 8D 9D 
    1H 2H 3H 4H 5H 6H 7H 8H 9H 
    1S 2S 3S 4S 5S 6S 7S 8S 9S 
    
    Shuffled deck
    6S 3S 7H 2H 1C 1H 8C 3D 4S 
    7S 6D 4H 9S 1D 9H 7C 7D 5D 
    8D 6C 5S 4D 8S 5H 3H 2S 4C 
    2C 1S 2D 9D 9C 3C 6H 8H 5C 
    

    洗牌法

    
    public static void shuffleDeck(int[] deck) { 
          for (int i = deck.length-1; i >= 0; i--) {
              // get card to be swapped index.
              int loc = (int)(Math.random()*i);
              // and swap it with the one at i.
              // note that that card will never be moved again.
              int temp = deck[i];
              deck[i] = deck[loc];
              deck[loc] = temp;
          }
    }
    

    显示方式

    static String suits = "CDHS";
    public static void display(int[] deck) {
        for (int k = 0; k < deck.length; k++) {
            int card = deck[k];
            System.out.printf("%s%s ", card % 9 + 1,
                    suits.charAt(card / 9));
            if ((k + 1) % 9 == 0) {
                System.out.println();
            }
        }
    }
    

    【讨论】:

    • 我只使用 36 码的甲板
    • 我的 1 个俱乐部不见了。它只是输出“1 of ____”。我确实修复了一些代码。更新了我的代码
    【解决方案3】:

    由于

    你正在创建int k = (int) ((Math.random() * 35) + 0);

    int j = (int) ((Math.random() * 35) + 0);

    在同一个方法中两次。这行不通。

    你应该得到一个错误

    变量“k”已经在作用域中定义了

    请尝试为每个变量使用唯一的名称以避免这种情况。

    【讨论】:

      猜你喜欢
      • 2011-07-09
      • 1970-01-01
      • 2017-01-26
      • 2012-05-09
      • 2012-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多