java - 使用Java生成一个范围内的随机整数

  显示原文与译文双语对照的内容

我试着用Java生成随机整数,但在特定范围内随机。 例如我的范围是 5 -10,这意味着 5是随机数可以接受的最小值,10是最大值。 这些数字之间的任何其他数字也可以是一个值。

在Java中,有一个方法是 random()Math 中的类,该方法返回一个 double 介于 0.0和 1.0. 在类 Random 中有一个方法 nextInt(int n),它在 0 ( 包含) 和n ( 独占) 范围内返回一个随机整数值。 我找不到一个方法,它返回两个数字之间的随机整数值。

我已经尝试了以下事情,但仍然有问题: ( 最小值和最大值是最小和最大的数字) 。

解决方案1:


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

问题:randomNum 是assinged值大于 maximum

解决方案2:


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

问题:randomNum 被分配的值小于 minimum

如何解决这个问题?

我还尝试浏览存档并找到:

但我无法解决这个问题。

时间:

执行以下操作的标准方法如下:


/**
 * Returns a pseudo-random number between min and max, inclusive.
 * The difference between min and max can be at most
 * <code>Integer.MAX_VALUE - 1</code>.
 *
 * @param min Minimum value
 * @param max Maximum value. Must be greater than min.
 * @return Integer between min and max, inclusive.
 * @see java.util.Random#nextInt(int)
 */
public static int randInt(int min, int max) {

//NOTE: Usually this should be a field rather than a method
//variable so that it is not re-seeded every call.
 Random rand = new Random();

//nextInt is normally exclusive of the top value,
//so add 1 to make it inclusive
 int randomNum = rand.nextInt((max - min) + 1) + min;

 return randomNum;
}

查看相关的JavaDoc 。 实际上,java.util.Random 类通常比 java.lang.Math.random() 类更好。

特别是,当标准库中有一个简单的API来完成任务时,不需要重新创建随机整数生成轮子。

实现这里目的的一种标准模式是:


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

Java 函数库函数 Math.random() 在范围 [0,1) 中生成一个double值。 注意这里范围不包括 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,你得到了一个double值。 为了获得包含的Max 值,你需要将 1添加到你的范围参数 (Max - Min),然后将小数部分截断为一个 int 。 这是通过以下方式完成的:


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

你在那里。 在范围 [Min,Max] 或者示例 [5,10] 中的随机整数值:


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

请原谅我的吹毛求疵,但多数 换句话说,建议的解决方案, min + rng.nextInt(max - min + 1)) 由于以下事实,似乎很危险:

  • rng.nextInt(n) 无法访问 Integer.MAX_VALUE 。
  • ( 最大- 最小) 在最小值为负时可能导致溢出。

对于任何内最小 <= 最大一种绝对安全的解决方案将会返回正确 results.


int nextIntInRange(int min, int max, Random rng) {
 if (min> max) {
 throw new IllegalArgumentException("Cannot draw random int from invalid range [" + min +"," + max +"].");
 }
 int diff = max - min;
 if (diff> = 0 && diff!= Integer.MAX_VALUE) {
 return (min + rng.nextInt(diff + 1));
 }
 int i;
 do {
 i = rng.nextInt();
 } while (i <min || i> max);
 return i;
}

尽管效率很低,但注意while-loop中成功的概率总是 50%或者更高。

多线程环境的ThreadLocalRandom等价类 java.util.Random 。 生成一个随机数在每个线程的本地执行。 所以我们通过减少冲突来获得更好的性能。


int rand = ThreadLocalRandom.current().nextInt(x,y);

x,y - 间隔 比如 ( 1,10 )

Java 是 0 Math.Random的职业。 所以如果你写一些像


Random rand = new Random();
int x = rand.nextInt(10);

x 将在 0 -9包含之间。

因此,给定以下 25个项目,生成 0 ( 数组的基) 和 array.length 之间随机数的代码将是:


String[] i = new String[25];
Random rand = new Random();
int index = 0;

index = rand.nextInt(i.Length)

由于 i.Length 将返回 25,所以 nextInt(i.Length) 将返回一个介于 0 -24之间的数字。 另一个选项是使用 Math.Random,它的工作方式相同。


 index = (int)Math.floor(Math.random()*i.length);

为了更好的理解,查看论坛文章 随机间隔

...