如何在java中生成特定范围内的随机整数?

eufgjt7s  于 2021-06-30  发布在  Java
关注(0)|答案(30)|浏览(481)

如何生成随机 int 特定范围内的值?
我尝试了以下方法,但这些方法不起作用:
尝试1:

randomNum = minimum + (int)(Math.random() * maximum);

缺陷: randomNum 可以大于 maximum .
尝试2:

Random rn = new Random();
int n = maximum - minimum + 1;
int i = rn.nextInt() % n;
randomNum =  minimum + i;

缺陷: randomNum 可以小于 minimum .

jslywgbw

jslywgbw1#

在掷骰子的情况下,它将是1到6(不是0到6)之间的随机数,因此:

face = 1 + randomNumbers.nextInt(6);
tjrkku2a

tjrkku2a2#

请注意,这种方法比传统方法更偏颇,效率更低 nextInt 接近,https://stackoverflow.com/a/738651/360211
实现这一点的一个标准模式是:

Min + (int)(Math.random() * ((Max - Min) + 1))

java数学库函数math.random()生成一个范围内的双精度值 [0,1) . 请注意,此范围不包括1。
为了首先得到一个特定的值范围,需要乘以要覆盖的值范围的大小。

Math.random() * ( Max - Min )

这将返回范围内的值 [0,Max-Min) ,其中不包括“max min”。
例如,如果你想 [5,10) ,您需要覆盖五个整数值,以便使用

Math.random() * 5

这将返回范围内的值 [0,5) ,其中不包括5。
现在你需要把这个范围移到你的目标范围。您可以通过添加最小值来实现这一点。

Min + (Math.random() * (Max - Min))

您现在将获得范围内的值 [Min,Max) . 以我们为例,这意味着 [5,10) :

5 + (Math.random() * (10 - 5))

但是,这还不包括 Max 你得到了一个双倍的值。为了得到 Max 如果包含值,则需要在range参数中添加1 (Max - Min) 然后通过强制转换为int来截断小数部分。这是通过以下方式实现的:

Min + (int)(Math.random() * ((Max - Min) + 1))

就在这里。范围内的随机整数值 [Min,Max] ,或根据示例 [5,10] :

5 + (int)(Math.random() * ((10 - 5) + 1))
uujelgoq

uujelgoq3#

您可以在java 8中简明扼要地实现这一点:

Random random = new Random();

int max = 10;
int min = 5;
int totalNumber = 10;

IntStream stream = random.ints(totalNumber, min, max);
stream.forEach(System.out::println);
btqmn9zl

btqmn9zl4#

这种方法使用起来可能很方便:
此方法将返回所提供的最小值和最大值之间的随机数:

public static int getRandomNumberBetween(int min, int max) {
    Random foo = new Random();
    int randomNumber = foo.nextInt(max - min) + min;
    if (randomNumber == min) {
        // Since the random number is between the min and max values, simply add 1
        return min + 1;
    } else {
        return randomNumber;
    }
}

此方法将从提供的最小值和最大值中返回一个随机数(因此生成的数字也可以是最小值或最大值):

public static int getRandomNumberFrom(int min, int max) {
    Random foo = new Random();
    int randomNumber = foo.nextInt((max + 1) - min) + min;

    return randomNumber;
}
kx5bkwkv

kx5bkwkv5#

我想知道apachecommons数学库提供的任何随机数生成方法是否符合要求。
例如: RandomDataGenerator.nextInt 或者 RandomDataGenerator.nextLong

evrscar2

evrscar26#

public static Random RANDOM = new Random(System.nanoTime());

public static final float random(final float pMin, final float pMax) {
    return pMin + RANDOM.nextFloat() * (pMax - pMin);
}
wd2eg0qa

wd2eg0qa7#

最好使用securerandom,而不仅仅是random。

public static int generateRandomInteger(int min, int max) {
    SecureRandom rand = new SecureRandom();
    rand.setSeed(new Date().getTime());
    int randomNum = rand.nextInt((max - min) + 1) + min;
    return randomNum;
}
avkwfej4

avkwfej48#

我用这个:

/**
   * @param min - The minimum.
   * @param max - The maximum.
   * @return A random double between these numbers (inclusive the minimum and maximum).
   */
 public static double getRandom(double min, double max) {
   return (Math.random() * (max + 1 - min)) + min;
 }

如果需要,可以将其转换为整数。

wecizke3

wecizke39#

只需使用随机类:

Random ran = new Random();
// Assumes max and min are non-negative.
int randomInt = min + ran.nextInt(max - min + 1);
uelo1irk

uelo1irk10#

rand.nextInt((max+1) - min) + min;
3hvapo4f

3hvapo4f11#

int random = minimum + Double.valueOf(Math.random()*(maximum-minimum )).intValue();

或者看看apache commons中的randomutils。

gupuwyp2

gupuwyp212#

下面是一个简单的示例,演示如何从闭合的 [min, max] 范围,而 min <= max is true 您可以在hole类中将其作为字段重用,同时还具有 Random.class 方法在一个地方
结果示例:

RandomUtils random = new RandomUtils();
random.nextInt(0, 0); // returns 0
random.nextInt(10, 10); // returns 10
random.nextInt(-10, 10); // returns numbers from -10 to 10 (-10, -9....9, 10)
random.nextInt(10, -10); // throws assert

资料来源:

import junit.framework.Assert;
import java.util.Random;

public class RandomUtils extends Random {

    /**
     * @param min generated value. Can't be > then max
     * @param max generated value
     * @return values in closed range [min, max].
     */
    public int nextInt(int min, int max) {
        Assert.assertFalse("min can't be > then max; values:[" + min + ", " + max + "]", min > max);
        if (min == max) {
            return max;
        }

        return nextInt(max - min + 1) + min;
    }
}
pxiryf3j

pxiryf3j13#

您可以将第二个代码示例编辑为:

Random rn = new Random();
int range = maximum - minimum + 1;
int randomNum =  rn.nextInt(range) + minimum;
t1rydlwq

t1rydlwq14#

从Java7开始,您不应该再使用 Random . 对于大多数用途,随机数发生器的选择是现在 ThreadLocalRandom .
对于fork-join池和并行流,使用 SplittableRandom .
约书亚·布洛赫。有效的java。第三版。

从Java8开始

对于fork-join池和并行流,使用 SplittableRandom 这通常是更快,有更好的统计独立性和均匀性的性质相比 Random .
生成一个随机的 int 在范围内 [0, 1_000]: ```
int n = new SplittableRandom().nextInt(0, 1_001);

生成一个随机的 `int[100]` 范围中的值数组 `[0, 1_000]:` ```
int[] a = new SplittableRandom().ints(100, 0, 1_001).parallel().toArray();

要返回随机值流,请执行以下操作:

IntStream stream = new SplittableRandom().ints(100, 0, 1_001);
xurqigkl

xurqigkl15#

下面是一个生成随机变量的有用类 ints 在包含/排除边界的任意组合的范围内:

import java.util.Random;

public class RandomRange extends Random {
    public int nextIncInc(int min, int max) {
        return nextInt(max - min + 1) + min;
    }

    public int nextExcInc(int min, int max) {
        return nextInt(max - min) + 1 + min;
    }

    public int nextExcExc(int min, int max) {
        return nextInt(max - min - 1) + 1 + min;
    }

    public int nextIncExc(int min, int max) {
        return nextInt(max - min) + min;
    }
}

相关问题