如何解决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中的哈希冲突,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将赢得多少场比赛?多少场比赛将导致平局?(注:只需打印回答这三个问题的总数) 我被卡住的地方是我如何保
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