这个想法是,我可以设置最大值为15或25,但如果模具只有20面,它不应该滚动高于20。
我正在创建一个模具辊作为个人项目。我创建了一个Dice对象,它接受骰子的大小(有多少面)以及骰子上可以滚动的最小值和最大值。我有一个问题,在一个20面的模具,如果我设置的最大超过20它会滚动高于20。我通过实现一个do while循环修复了这个问题,该循环一直运行到随机值产生的值小于骰子的大小。
这对我来说似乎非常低效,因为理论上它可以运行几个小时,只是一次又一次地得到不正确的值。我正在寻找一个更有效的解决方案。
//Main.java
public class Main {
public static void main(String[] args) {
MinMaxDice d20 = new MinMaxDice(20, 10, 20);
System.out.println("\nThere are " + d20.sides + " sides on this die.");
System.out.println("The max is " + d20.max + " and the min is " + d20.min + ".");
for (int i = 0; i < 20; i++) {
System.out.println("It rolled a " + d20.rollDie() + ".");
}
}
}
//MinMaxDice.java
import java.util.concurrent.ThreadLocalRandom;
public class MinMaxDice extends Dice {
int max;
int min;
MinMaxDice(int sides, int min, int max) {
super(sides);
this.max = max;
this.min = min;
}
public int rollDie() {
int result;
do {
result = this.min + ThreadLocalRandom.current().nextInt(this.max - (this.min - 1));
} while (result > sides);
return result;
}
}
2条答案
按热度按时间nlejzf6q1#
假设我正确地解释了你的意图,作为一个具体的例子,
rollDie
对于一个MinMaxDice
,sides = 20
,min = 16
和max = 25
应该产生一个16到20之间的int值,每个都有20%的机会。在这种情况下,我们可以使用
ThreadLocalRandom.nextInt(int origin, int bound)
在允许的范围内生成一个随机数:返回一个在指定原点(包含原点)和指定界限(不包含原点)之间伪随机选择的int值。
gblwokeq2#
这个问题并不像我想象的那么独特,答案超级简单。我只是用一个if语句替换了do-while,如果max值大于sides,则将其更改为sides。简单的Peasy,我甚至问了这个问题。