java 我正试图为一个随机整数生成器设置一个上限,它独立于生成器本身设置的最大值

nnvyjq4y  于 2023-06-04  发布在  Java
关注(0)|答案(2)|浏览(197)

这个想法是,我可以设置最大值为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;
    }
}
nlejzf6q

nlejzf6q1#

假设我正确地解释了你的意图,作为一个具体的例子,rollDie对于一个MinMaxDicesides = 20min = 16max = 25应该产生一个16到20之间的int值,每个都有20%的机会。
在这种情况下,我们可以使用ThreadLocalRandom.nextInt(int origin, int bound)在允许的范围内生成一个随机数:
返回一个在指定原点(包含原点)和指定界限(不包含原点)之间伪随机选择的int值。

public int rollDie() {
    return ThreadLocalRandom.current()
            .nextInt(this.min, 1 + Math.min(this.max, this.sides));
}
gblwokeq

gblwokeq2#

这个问题并不像我想象的那么独特,答案超级简单。我只是用一个if语句替换了do-while,如果max值大于sides,则将其更改为sides。简单的Peasy,我甚至问了这个问题。

相关问题