如何在特定范围内生成随机 int
值?
我尝试了以下,但那些不起作用:
Attempt 1:
randomNum = minimum + (int)(Math.random() * maximum);
// Bug: `randomNum` can be bigger than `maximum`.
Attempt 2:
Random rn = new Random();
int n = maximum - minimum + 1;
int i = rn.nextInt() % n;
randomNum = minimum + i;
// Bug: `randomNum` can be smaller than `minimum`.
30 回答
或者看看Apache Commons中的RandomUtils .
使用:
整数
x
现在是具有5-10
可能结果的随机数 .当您需要大量随机数时,我不推荐API中的Random类 . 这个时期太短了 . 请尝试使用Mersenne twister . 有a Java implementation .
在滚动骰子的情况下,它将是1到6之间的随机数(不是0到6),因此:
ThreadLocalRandom等效于多线程环境的类java.util.Random . 在每个线程中本地执行生成随机数 . 因此,通过减少冲突,我们可以获得更好的表现 .
x,y - 间隔,例如(1,10)
约书亚布洛赫 . 有效的Java . 第三版 .
从Java 8开始
对于fork连接池和并行流,使用
SplittableRandom
通常更快,与Random
相比具有更好的统计独立性和均匀性属性 .生成
[0, 1_000]:
范围内的随机int
生成
[0, 1_000]:
范围内的随机int[100]
值数组要返回随机值流:
让我们举个例子 .
假设我希望在_79413之间生成一个数字:
让我们理解这一点......
使用nextint(n)方法生成最小值和最大值之差的随机数,然后将最小值添加到结果中:
使用java-8,他们在Random类中引入了方法ints(int randomNumberOrigin, int randomNumberBound) .
例如,如果要在[0,10]范围内生成五个随机整数(或单个整数),只需执行以下操作:
第一个参数仅表示生成的
IntStream
的大小(这是产生无限IntStream
的方法的重载方法) .如果需要进行多次单独调用,可以从流中创建无限原始迭代器:
您也可以为
double
和long
值执行此操作 .希望能帮助到你! :)
如果您想尝试以上投票最多的答案,您可以简单地使用此代码:
它干净而简单 .
您可以编辑第二个代码示例:
在 Java 1.7 or later 中,执行此操作的标准方法如下:
见the relevant JavaDoc . 这种方法的优点是不需要显式初始化java.util.Random实例,如果使用不当,可能会造成混淆和错误 .
然而,相反地,没有办法明确地设置种子,因此在有用的情况下(例如测试或保存游戏状态或类似情况)可能难以再现结果 . 在这些情况下,可以使用下面显示的Java之前的1.7技术 .
Before Java 1.7 ,执行此操作的标准方法如下:
见the relevant JavaDoc . 在实践中,java.util.Random类通常优于java.lang.Math.random() .
特别是,当标准库中有一个简单的API来完成任务时,不需要重新发明随机整数生成轮 .
使用:
您可以在Java 8中简明扼要地实现:
这是一个有用的类,可以在包含/包含任意组合的范围内生成随机
ints
:这种方法可能很方便使用:
此方法将返回随机数 between 提供的最小值和最大值:
并且此方法将返回随机数 from 提供的最小值和最大值(因此生成的数字也可以是最小值或最大值):
Java中的
Math.Random
类是从0开始的 . 所以,如果你写这样的东西:x
将介于0-9
之间 .因此,给定以下
25
项数组,在0
(数组的基数)和array.length
之间生成随机数的代码将是:由于
i.length
将返回25
,nextInt( i.length )
将返回0-24
范围之间的数字 . 另一种选择是使用Math.Random
,它以相同的方式工作 .为了更好地理解,请查看论坛帖子Random Intervals (archive.org) .
只需使用Random类:
只需对您的第一个解决方案进行一些小修改就足够了 .
在这里查看更多Random的实施
我想知道Apache Commons Math库提供的任何随机数生成方法是否符合要求 .
例如:RandomDataGenerator.nextInt或RandomDataGenerator.nextLong
另一种选择是使用Apache Commons:
最好使用SecureRandom而不仅仅是Random .
这工作正常 .
这是一个简单的示例,显示如何从关闭
[min, max]
范围生成随机数,而min <= max is true
您可以将它作为孔类中的字段重用,也可以在一个地方使用所有
Random.class
方法Results example:
Sources:
请注意,这种方法比
nextInt
方法更具偏见且效率更低,https://stackoverflow.com/a/738651/360211实现这一目标的一个标准模式是:
Java Math库函数Math.random()生成
[0,1)
范围内的double值 . 请注意,此范围不包括1 .为了首先获得特定范围的值,您需要乘以您想要覆盖的值范围的大小 .
这将返回
[0,Max-Min)
范围内的值,其中不包括'Max-Min' .例如,如果您想要
[5,10)
,则需要覆盖五个整数值,以便使用这将返回
[0,5)
范围内的值,其中不包括5 .现在,您需要将此范围更改为您要定位的范围 . 您可以通过添加Min值来完成此操作 .
您现在将获得
[Min,Max)
范围内的值 . 按照我们的例子,这意味着[5,10)
:但是,这仍然不包括
Max
并且您获得了双倍 Value . 为了获得Max
值,您需要在范围参数(Max - Min)
中加1,然后通过强制转换为int来截断小数部分 . 这是通过以下方式完成你有它 .
[Min,Max]
范围内的随机整数值,或者根据示例[5,10]
:我找到了这个例子Generate random numbers:
此示例生成特定范围内的随机整数 .
此类的示例运行:
请原谅我的挑剔,但多数人建议的解决方案,即
min + rng.nextInt(max - min + 1))
,似乎是危险的,因为:rng.nextInt(n)
无法达到Integer.MAX_VALUE
.当
min
为负时,(max - min)
可能会导致溢出 .一个万无一失的解决方案将为[
Integer.MIN_VALUE
,Integer.MAX_VALUE
]内的任何min <= max
返回正确的结果 . 考虑以下天真的实现:虽然效率低下,但请注意
while
循环中成功的概率始终为50%或更高 .要么