Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何解决Java中的哈希冲突_Java - Fatal编程技术网

如何解决Java中的哈希冲突

如何解决Java中的哈希冲突,java,Java,使用Java编写以下程序: 假设Player1有7个骰子,Player2有5个骰子(所有12个骰子都是标准的1到6个骰子,并且都是普通的)。两名玩家掷骰子并比较各自的总和(即玩家1掷骰子1,3,5,2,6,1,1=19,玩家2掷骰子2,1,4,6,3=16)。如果玩家1的掷骰总数高于玩家2,则玩家1赢得比赛,否则玩家2获胜。如果所有2176782336组合都被掷骰,玩家1将赢得多少场比赛?玩家2将赢得多少场比赛?多少场比赛将导致平局?(注:只需打印回答这三个问题的总数) 我被卡住的地方是我如何保

使用Java编写以下程序:

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

我被卡住的地方是我如何保证我没有重复的卷

谢谢

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
}
import java.util.Random;
公共类KDice{
公共静态void main(字符串[]args){
随机=新随机();
长距离比赛赢=0,长距离比赛赢=0,平局=0;
int PLAYERTONESUM,PLAYERTOWOSUM;
//对于长数字,使用L作为后缀
用于(长i=0;i<2176782336L;i++){
//为玩家1掷骰子
playerOneSum=掷骰子(随机,7);
//为玩家2掷骰子
playerTwoSum=掷骰子(随机,5);
//找出谁赢了
如果(playerToSum==playerTorToSum){
ties++;
}否则如果(playerSum>playerWoSum){
playerwins++;
}否则{
playerTwoWins++;
}
}
//完成所有回合后,显示统计信息
System.out.println(“玩家1获胜:+playerWins”);
System.out.println(“玩家2赢:+playerTwoWins”);
System.out.println(“Ties:+Ties”);
}
公共静态整数骰子(随机,整数计数){
整数和=0;
for(int i=0;i

}2176782336是可能发生的组合可能性的数量(=6^12)。 正如我看到的,你正在尝试随机滚动2176782336次——我认为这无法解决你的问题

编辑,使用12嵌套for循环可能会解决您的问题:

public static void main(String args[]) {
    int numP1Win = 0;
    int numP2Win = 0;
    int numdraw = 0;
    for (int i = 1; i <= 6; i++) {
        for (int j = 1; j <= 6; j++) {
            for (int k = 1; k <= 6; k++) {
                for (int l = 1; l <= 6; l++) {
                    for (int m = 1; m <= 6; m++) {
                        for (int n = 1; n <= 6; n++) {
                            for (int o = 1; o <= 6; o++) {
                                for (int p = 1; p <= 6; p++) {
                                    for (int q = 1; q <= 6; q++) {
                                        for (int r = 1; r <= 6; r++) {
                                            for (int s = 1; s <= 6; s++) {
                                                for (int t = 1; t <= 6; t++) {
                                                    if (i + j + k + l + m + n + o > p + q + r + s + t) {
                                                        numP1Win++;
                                                    }
                                                    else if (i + j + k + l + m + n + o < p + q + r + s + t) {
                                                        numP2Win++;
                                                    }
                                                    else {
                                                        numdraw++;
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    System.out.println("Num P1 Win: " + numP1Win);
    System.out.println("Num P2 Win: " + numP2Win);
    System.out.println("Num Draw: " + numdraw);
}
publicstaticvoidmain(字符串参数[]){
int numP1Win=0;
int numP2Win=0;
int numdraw=0;

对于(int i=1;i如果你试图通过每个组合,你不应该随机滚动。只需系统地通过每个组合(例如,循环),并在进行时进行计数。

为了模拟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++;
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}

我觉得你误解了这个问题

该问题要求你检查所有可能的结果,并将每个结果分为“A赢”、“B赢”或“A平”

为此,您不能使用随机。如果您多次运行该程序,答案应该不会改变。要枚举所有可能的掷骰子组合,您可以使用12个嵌套的
循环,每个循环的计数范围为1到6。这样,最里面的循环体将执行6^12次-每个可能的结果正好执行一次。您需要的是o要做的是将7个循环变量求和,并将其与其他5个循环变量的和进行比较。在此基础上,增加“A赢”、“B赢”或“平局”的计数器


或者,您不需要计算结数,因为您总是知道结果的总数。

这里有一种更紧凑、更高效的方法来实现这一点。它通过以下方式工作:

  • 从12个骰子的数组开始,初始化为所有1(第一次“掷骰”的最后一个除外)
  • 然后,这些骰子在准
    base 7
    中基本上递增,以获得下一次掷骰。
    quasi
    ,因为没有
    0
  • 通过添加
    1
    或减去
    5
    来修改总和,具体取决于相邻骰子之间的转换,这将通过
    +1
    -5
    改变总和

当一种平局形式是玩家1的所有相同骰子也出现在玩家2时,你为什么要保证没有重复掷骰子?如果你试图确定12个骰子的每个组合的赢/输/平局数,为什么你随机掷骰子?为什么不创建每个骰子组合并从下一个骰子开始re?
System.out.format(“Ties:%,d%n”,Ties);
等将通过在数字中添加分组分隔符使输出更易于阅读。这种方法与下面的代码片段相同,但为什么答案不同?非常感谢。看起来好像误解了所问的内容。你是对的,我误解了所问的内容。谢谢
Player 1 win: 1877280394
Player 2 win: 225654001
Ties: 73847941
int[] dice = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 };
int sum5 = 4; // inital sum for sum of five dice before first toss
int sum7 = 7; // initial sum for sum of seven dice before first toss
int sum7wins = 0; 
int sum5wins = 0;
int ties = 0;
outer:
for(;;) {
    for (int i = dice.length - 1; i >= 0;) {
        int val = dice[i];
        if (val < 6) {
            dice[i] = val + 1;
            if (i < 7) {
                sum7++;
            } else {
                sum5++;
            }
            break;
        }
        if (i == 0) {
            // first die is a 6 so we're done.
            break outer;
        }
        dice[i] = 1;
        if(i < 7) {
            sum7-=5;
        } else {
            sum5-=5;
        }
        i--;
    }

    if (sum5 > sum7) {
        sum5wins++;
    } else if (sum7 > sum5) {
        sum7wins++;
    } else {
        ties++;
    }
}

System.out.println("sum7wins: " + sum7wins);
System.out.println("sum5wins: " + sum5wins);
System.out.println("ties: " + ties);
sum7wins: 1877205968
sum5wins: 225571216
ties: 74005152