我正在尝试编写一个方法rollDice(int number,int nSides),它返回用nSides边滚动数字骰子的总结果。
所以例如rollDice(3,6)应该返回滚动3个六面骰子的结果(添加到3到18之间的数字)。
当我为int number
键入1时,下面的方法返回负数,我需要做些什么来解决这个问题?
public static int rollDice(int number, int nSides) {
int num = 0;
if(nSides >=3)
{
for(int i = 0; i < number; i++){
Random r = new Random();
int roll = r.nextInt();
num = num + (roll % nSides)+1;
}
}
else{
System.out.println("Error num needs to be from 3");
}
return num;
}
答案 0 :(得分:12)
Random.nextInt()
具有不可预测的行为 - 它可以为整数生成所有可能的值,包括负数。改为使用Random.nextInt(numSides)
- 它将从[0,numSides]返回一个整数,即包括0并排除numSides。要获得所需的功能[1,数字],请使用
r.nextInt(numSides)+1;
有关详细信息,请参阅here。
答案 1 :(得分:5)
您只需要初始化Random r
和int roll
,因此我已将其从循环中移除。 nextInt(int)方法从0中选择一个整数,但不包括int。这被称为0(包括)到int(不包括),因此您必须添加1以调整到模具的范围。你似乎已经知道,虽然我不知道你为什么使用%。使用*乘以会给你所有骰子的相同数字,我不相信你的意思。以下是您班级的一种可能实施方式:
import java.util.Random;
public class Dice {
public static int rollDice(int number, int nSides)
{
int num = 0;
int roll = 0;
Random r = new Random();
if(nSides >=3)
{
for(int i = 0; i < number; i++)
{
roll = r.nextInt(nSides)+1;
System.out.println("Roll is: "+roll);
num = num + roll;
}
}
else
{
System.out.println("Error num needs to be from 3");
}
return num;
}
public static void main(String[] args)
{
System.out.println("Total is: "+rollDice(3, 6));
}
}
/*
Roll is: 4
Roll is: 1
Roll is: 2
Total is: 7
*/
答案 2 :(得分:2)
替换
int roll = r.nextInt();
与
int roll = r.nextInt(nSides);
答案 3 :(得分:0)
如果对负数使用%
,则会得到负数。
在这种情况下,解决方案很简单,使用
int roll = r.nextInt(nSides) + 1; // 1 to nSizes
num += roll;
答案 4 :(得分:0)
这与rollDice方法有关:
public static int rollDice(int number, int nSides) {
int count = 0;
for(int i = 0; i < number; i++) {
count += (int)(Math.random() * nSides) + 1;
}
return count;
}