java - 如何解决 Java 中的哈希冲突

标签 java

使用Java编写以下程序:

假设玩家 1 有 7 个骰子,玩家 2 有 5 个骰子(所有 12 个骰子都是标准的 1 到 6 骰子并且公平)。两名玩家都掷骰子并比较各自的总和(即玩家 1 掷骰子 1,3,5,2,6,1,1 = 19,玩家 2 掷骰子 2,1,4,6,3 = 16)。如果玩家 1 掷出的总和高于玩家 2,则玩家 1 赢得比赛,否则玩家 2 获胜。如果掷出所有 2,176,782,336 个组合,玩家 1 将赢得多少场比赛? Player2 会赢得多少场比赛?有多少场比赛会出现平局? (注:只需打印回答三个问题的总和)

我陷入困境的部分是如何保证我没有重复的卷?

谢谢。

import java.util.Random;

public class KDice {
public static void main(String[] args) {
    Random random = new Random();
    long playerOneWins = 0, playerTwoWins = 0, ties = 0;
    int playerOneSum, playerTwoSum;

    //for long number use L as suffix
    for (long i = 0; i < 2176782336L; i++) {
    //roll dice for player 1
        playerOneSum = rollDice(random, 7);
    //roll dice for player 2
        playerTwoSum = rollDice(random, 5);
        //find who won
        if (playerOneSum == playerTwoSum) {
            ties++;
        } else if (playerOneSum > playerTwoSum) {
            playerOneWins++;
        } else {
            playerTwoWins++;
        }
    }
    //after all the round done, display stats
    System.out.println("Player 1 win: " + playerOneWins);
    System.out.println("Player 2 win: " + playerTwoWins);
    System.out.println("Ties: " + ties);
}

public static int rollDice(Random random, int count) {
    int sum = 0;
    for (int i = 0; i < count; i++) {
        sum += generateRandomNumber(random);
    }

    return sum;
}

public static int generateRandomNumber(Random random) {
    return random.nextInt(6) + 1; //return number between 1 to 6
}

}

最佳答案

为了模拟 12 个骰子的每种可能的掷骰,我使用 12 个嵌套的 for 循环,以便可以生成每种可能的骰子。

我用这个循环替换了随机掷骰子:

int[] dice = new int[12];

for (dice[0] = 1; dice[0] <= 6; dice[0]++) {
    System.out.println("dice[0] = " + dice[0]);

    for (dice[1] = 1; dice[1] <= 6; dice[1]++) {
        System.out.println("dice[1] = " + dice[1]);

        for (dice[2] = 1; dice[2] <= 6; dice[2]++) {
            System.out.println("dice[2] = " + dice[2]);

            for (dice[3] = 1; dice[3] <= 6; dice[3]++) {
                for (dice[4] = 1; dice[4] <= 6; dice[4]++) {
                    for (dice[5] = 1; dice[5] <= 6; dice[5]++) {
                        for (dice[6] = 1; dice[6] <= 6; dice[6]++) {
                            for (dice[7] = 1; dice[7] <= 6; dice[7]++) {
                                for (dice[8] = 1; dice[8] <= 6; dice[8]++) {
                                    for (dice[9] = 1; dice[9] <= 6; dice[9]++) {
                                        for (dice[10] = 1; dice[10] <= 6; dice[10]++) {
                                            for (dice[11] = 1; dice[11] <= 6; dice[11]++) {

                                                playerOneSum = dice[0] + dice[1] + dice[2] + dice[3] + dice[4] + dice[5] + dice[6];
                                                playerTwoSum = dice[7] + dice[8] + dice[9] + dice[10] + dice[11];


                                                //find who won
                                                if (playerOneSum == playerTwoSum) {
                                                    ties++;
                                                } else if (playerOneSum > playerTwoSum) {
                                                    playerOneWins++;
                                                } else {
                                                    playerTwoWins++;
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}

跑完大约需要三四分钟。我放入 println 是为了避免我太不耐烦。结果是:

Player 1 win: 1877280394
Player 2 win: 225654001
Ties: 73847941

关于java - 如何解决 Java 中的哈希冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61390303/

相关文章:

java - java如何判断是否存在明显的死锁?

java - Spring WS 2.0.2 : Using StAX with @Endpoint

java - 无法使用 Gradle 和 Kotlin 运行生成的 JAR 文件

java - 确定 JSON 提要中是否存在值的更好方法

java - 重复调用 System.currentTimeMillis()/nanoTime()

java - Spring Boot 项目命名约定

java - 如何正确关闭java程序【初级】

java - JSR-303 验证的@NotNull 说明

java - 在 Java 中编写具有双返回值和参数的算法方法的问题

java - 实现封装的正确方法