- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我刚刚开始学习 Java 编程,并编写了一个程序来掷 x 面骰子 x 次。边数和卷数由用户输入定义。该程序以 JTable
格式给出每个数字的绝对频率和相对频率。一切都很顺利,直到您为侧面和卷数选择较大的数字。我收到 ArrayIndexOutOfBoundsException
但在代码中找不到任何相应的错误。
package rolling;
import java.awt.*;
import java.util.*;
import javax.swing.*;
import javax.swing.table.TableCellRenderer;
import javax.swing.JOptionPane;
public class RollDice extends JPanel {
private static final long serialVersionUID = -6332129624300946462L;
JTable jt;
int i, k, j; //Counter for loops
/*========== CONSTRUCTOR CREATES TABLE OBJECT ==========*/
public RollDice(int[] trial, int[] outcomes, int[] dice_numbers,
int[] count, float[] Rel_frequencies){
String[] columnNames = {"Number of trial", "Outcome", "Dice Numbers",
"Absolute Frequencies", "Relative Frequencies"};
Object[][] input = new Object[trial.length][columnNames.length];
for (i=0; i<trial.length; i++){
input[i][0] = trial[i];
}
for (i=0; i<outcomes.length; i++){
input[i][1] = outcomes[i];
}
for (i=0; i<dice_numbers.length; i++){
input[i][2] = dice_numbers[i];
}
for (i=0; i<count.length; i++){
input[i][3] = count[i];
}
for (i=0; i<Rel_frequencies.length; i++){
input[i][4] = Rel_frequencies[i];
}
/*Checking the outcome!
for (i=0; i<trial.length; i++){
System.out.println();
for (k=0; k<columnNames.length; k++){
System.out.printf("%d\t", input[i][k]);
}
}*/
jt = new JTable(input,columnNames)
{
/**
*
*/
private static final long serialVersionUID = 1L;
public boolean isCellEditable(int input, int columns)
{
return false;
}
public Component prepareRenderer(TableCellRenderer r, int input,
int columns){
Component c = super.prepareRenderer(r, input, columns);
if (input %2 == 0){
c.setBackground(Color.WHITE);
}
else{
c.setBackground(Color.LIGHT_GRAY);
}
if (isCellSelected(input, columns)){
c.setBackground(Color.YELLOW);
}
return c;
}
};
jt.setPreferredScrollableViewportSize(new Dimension(450, 600));
jt.setFillsViewportHeight(true);
JScrollPane jps = new JScrollPane(jt);
add(jps);
}
public static int[] roll_dice(int sides, int rolls){
int[] outcomes = new int[rolls];
int i; //Counter for accessing array position (element)
for (i=0; i<rolls; i++){
outcomes[i] = (int)(1 + Math.random() * sides);
}
return outcomes;
}
public static int[] Frequency_count(int[] outcomes, int sides){
int[] count = new int[sides];
int i;
int j, k = 0;
for(i=1; i<=sides; i++){
for(j=0; j<outcomes.length; j++){
if (outcomes[j] == i){
count[k]++;
}
}
//System.out.printf("%d \t %d\n",i, count[k]);
k++;
}
return count;
}
public static float[] Relative_frequencies(int[] count, int sides,
int rolls){
int i;
float[] Array = new float [sides];
for(i=0; i<sides; i++){
Array[i] = (float)count[i] / rolls * 100;
//String.format("%.3f", (float)Array[i]);
//System.out.printf("%d \t %.2f\n",i+1, Array[i]);
}
return Array;
}
public static void main(String[] args) {
/*=========USER INPUT via GUI: DECISION ON HOW MANY TIMES
THE DICE IS ROLLED===*
*========= AND HOW MANY SIDES THE DICE HAS ===*/
String fn = JOptionPane.showInputDialog("Enter the number of sides
of the dice");
String sn = JOptionPane.showInputDialog("Enter the number of rolls");
int sides = Integer.parseInt(fn); // number of sides
int rolls = Integer.parseInt(sn); // number of rolls
JOptionPane.showMessageDialog(null, "You rolled a " + sides + "
sided dice " + rolls + " times!", "User Input",
JOptionPane.INFORMATION_MESSAGE );
/*=========GENERATING RANDOM NUMBERS (ROLLING THE DICE) WITH
"roll_dice" method==========
*========= AND COUNTING THE NO. OF TRIALS ==========*/
int[] outcomes = roll_dice(sides, rolls);
int[] trial = new int[rolls];
int[] dice_numbers = new int[sides];
int i, k;
k = 1;
for(i=0; i<rolls; i++){
trial[i] = k;
//System.out.println(i + " " + k);
k++;
}
k = 1;
for(i=0; i<sides; i++){
dice_numbers[i] = k;
//System.out.println(i + " " + k);
k++;
}
/*=========COUNTING THE FREQUENCIES OF EACH NUMBER==========*/
//System.out.println("ABSOLUTE Frequencies plotted in FUNCTION:");
int[] count = Frequency_count(outcomes, sides);
//System.out.println("RELATIVE Frequencies plotted in FUNCTION:");
float[] Rel_frequencies = Relative_frequencies(count, sides, rolls);
/*=========CREATING A TABLE FORMAT WITH A JAVA
LIBRARY (JTABLE)==========*/
JFrame jf = new JFrame();
RollDice table1 = new RollDice(trial, outcomes, dice_numbers,
count, Rel_frequencies);
jf.setTitle("Absolute and Relative Frequencies of numbers for
an arbitrary Dice");
jf.setSize(500, 700);
jf.setVisible(true);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.add(table1);
}
}
最佳答案
看看这部分代码:
Object[][] input = new Object[trial.length][columnNames.length];
for (i=0; i<trial.length; i++){
input[i][0] = trial[i];
}
for (i=0; i<outcomes.length; i++){
input[i][1] = outcomes[i];
}
for (i=0; i<dice_numbers.length; i++){
input[i][2] = dice_numbers[i];
}
for (i=0; i<count.length; i++){
input[i][3] = count[i];
}
for (i=0; i<Rel_frequencies.length; i++){
input[i][4] = Rel_frequencies[i];
}
您将input
2D 数组设置为特定大小,但随后您不假思索地访问它。
例如,看看这个:
int[] trial = new int[rolls];
int[] dice_numbers = new int[sides];
假设用户掷 2 个骰子,得到 6 面骰子(传统骰子)。然后,例如,在第三个循环中,您访问 input[i][2]
,其中 i 从 0 运行到 5,但是由于 Trial.length = 2
,您正在访问不存在的索引。
您应该检查您的代码,以便仅根据初始化期间给定的边界访问您的数组(我对您的任务了解不够,无法尝试提出更好的建议)。
关于java - 掷骰子 - ArrayIndexOutOfBounds,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29729505/
我是 Java 新手,我正在尝试创建一个数组列表。 我制作了一个小程序,要求用户提供要掷的骰子数量: System.out.println("How many dices do you wan
我目前需要一些关于“简单”问题的建议。我正在构建一个游戏助手,用户可以在其中掷骰子(6 面骰子、20 面骰子等)。实际上,我只向用户显示号码。但是,为了更好用,我想在屏幕上显示骰子(例如,在带有自定义
我刚刚开始学习 Java 编程,并编写了一个程序来掷 x 面骰子 x 次。边数和卷数由用户输入定义。该程序以 JTable 格式给出每个数字的绝对频率和相对频率。一切都很顺利,直到您为侧面和卷数选择较
这段代码的用途:模拟100场CRAPS,记录第一轮输,第一轮赢,第二轮负加分,第二轮赢加分的#。 那些不熟悉掷骰子规则的人;您基本上掷两个骰子,如果结果不是 2、3 或 12 的总数,您可以再次掷骰(
所以我为龙与地下城创建了一个基本的掷骰子 dicord 机器人。 我到目前为止的代码可以掷任何类型的骰子,(例如“roll xdy”“roll 1d20”,“roll 100d100”) 当有人发送匹
我有一些关于java的问题。代码中有两个问题(我将它们作为注释留下)。另外使用设置和获取方法的目的是什么?您能简单地解释一下吗?我是初学者。谢谢:) public class Die { pri
尝试绘制 2 个骰子总和的 pmf,但出现一些右尾问题。 我尝试过使用 numpy 和其他 python 库,但问题仍然存在: import tensorflow as tf tf.enable_ea
当掷 2 个六面骰子时,最常见的结果应该是 7,而 2 和 12 是最不常见的结果。 当我执行下面的代码时,数字 12 的出现频率很高,这是错误的。 #include #include #incl
我正在尝试学习 Python 库 itertools,我认为一个好的测试是模拟掷骰子。使用 product 并使用 collections 库计算可能的方法数,很容易生成所有可能的滚动。我正在尝试解决
所以我做了这个掷骰子 100 次的方法,有 50% 的机会掷出 6。基本思想是 1 到 6 之间有 50% 的奇数和 50% 的偶数,所以如果掷出偶数,系统打印 6,否则打印 1 到 5 之间的随机数
我是 C++ 的初学者,这是家庭作业,但我卡住了。我还有一个问题,然后我就完成了。我想不出一种算法可以判断用户输入的是小直线 (1234) 还是 (2345) 还是 (3456)。我知道如何使用循环来
我是一名优秀的程序员,十分优秀!