如何在Groovy中使用随机数?

45

我使用这种方法:

def getRandomNumber(int num){
    Random random = new Random()
    return random.getRandomDigits(num)
}

当我调用它时,我写下 println getRandomNumber(4)

但是我出现了错误。

No signature of method: java.util.Random.getRandomDigits() is applicable for argument types: (java.lang.Integer) values: [4]

注意:我在另一个Groovy类中使用这种方法,而且没有任何错误。

6个回答

63

没有名为java.util.Random.getRandomDigits的方法。

要获取随机数,请使用nextInt:

return random.nextInt(10 ** num)

此外,当您的应用程序启动时,应该只创建一次随机对象:

Random random = new Random()

当你需要一个新的随机数时,不应该每次都创建一个新的随机对象。这样做会破坏随机性。


谢谢,注意:我在另一个Groovy类中使用了getRandomDigits(),它可以正常工作,没有任何错误。你可以搜索一下这个方法并查看它的效果。 - Georgian Citizen
getRandomDigits()java.util.Random中并不存在,正如@mark-byers所写。你指的是哪个类? - youri

39

生成介于1和[UPPER_LIMIT]之间的伪随机数

您可以使用以下代码生成介于1和上限之间的随机数。

Math.abs(new Random().nextInt() % [UPPER_LIMIT]) + 1

这是一个具体的示例:

示例 - 在1到600范围内生成伪随机数:

Math.abs(new Random().nextInt() % 600) + 1

在[LOWER_LIMIT]和[UPPER_LIMIT]之间生成伪随机数

如果您想使用不等于1的下限,则可以使用以下公式。

Math.abs(new Random().nextInt() % ([UPPER_LIMIT] - [LOWER_LIMIT])) + [LOWER_LIMIT]

这里是一个具体的例子:

示例-在40到99的范围内生成伪随机数:

Math.abs( new Random().nextInt() % (99 - 40) ) + 40

这将在40到99的范围内生成一个随机数。


2
稍作更正:Math.abs(new Random().nextInt() % 600) + 1。否则,你可能会得到一个模运算结果为-1和一个超出范围的结果为0,而不是正确的值2。 - Chip McCormick
如果我的需求是在40到99的范围内生成随机值,我的方法应该是什么? - hirosht
2
@hirosht Math.abs(new Random().nextInt() % (UpperLimit - LowerLimit)) + LowerLimit - El Cas
2
在选择这种技术之前,请参考https://dev59.com/12gu5IYBdhLWcg3w6bKo。将模算法应用于随机值会存在风险,即这些值的生成概率不相等。 - Mark Waite
@MarkWaite 任何在普通硬件上运行的代码都在一定程度上是确定性的。如果您能够生成具有真正分布概率的随机数,并且每个数字在范围内选择的机会相等,那么根据定义,这将是真正的随机数。就我所知,目前在普通硬件上实现这一点是不可能的。https://simplicable.com/new/pseudorandom-vs-random您能否详细说明您的意思? - anataliocs
@anataliocs,我在评论中提供的文章比我自己描述得更好。使用模算术生成子集通常会提供范围内较少的最大值,除非最大随机值是所需子集范围的偶数倍。请参见https://dev59.com/12gu5IYBdhLWcg3w6bKo的首选答案。 - Mark Waite

13

通常情况下,我发现使用Apache commons lang中的RandomUtils比使用java.util.Random更容易生成随机数。

使用Apache的RandomUtils时,无需担心存储Random对象以供后续调用。


1
你能提供一个支持你说法的代码示例吗?对我来说,apache.commons.lang.math.RandomUtils为什么比java.util.Random更容易使用并不是显而易见的。 - jayhendren

3
如果你想在包括0的范围内生成随机数,则使用以下代码,其中'max'是范围内的最大值。
Random rand = new Random()
random_num = rand.nextInt(max+1)

2
例如,假设您想创建一个介于50和60之间的随机数,可以使用以下方法之一。
new Random().nextInt()%6 +55

new Random().nextInt()%6返回的值在-5到5之间。当您将其加到55时,您可以获得50到60之间的值。

第二种方法:

Math.abs(new Random().nextInt()%11) +50

Math.abs(new Random().nextInt()%11) 可以创建一个介于0到10之间的随机数。然后,您可以加上50,这将给您一个介于50到60之间的值。


2
在选择这种技术之前,请参考https://dev59.com/12gu5IYBdhLWcg3w6bKo。将模算法应用于随机值会存在风险,即这些值的生成概率不相等。 - Mark Waite

2

最简单的方法:它将在0到(max_num-1)之间生成随机数

new Random().nextInt(max_num)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接