繁体   English   中英

Java中使用Math.random()的随机数

[英]Random numbers with Math.random() in Java

为了生成随机数,我使用了公式:

(int)(Math.random() * max) + min

我在Google上找到的公式似乎总是如下:

(int)(Math.random() * (max - min) + min)

哪一个对吗? 据我所知,我的公式中从未得到超出我的范围的数字

您的公式会在min和min + max之间生成数字。

谷歌发现的那个产生了最小和最大之间的数字。

谷歌赢了!

更好的方法是:

int x = rand.nextInt(max - min + 1) + min;

您的公式会在minmin + max之间生成数字。

Random random = new Random(1234567);
int min = 5;
int max = 20;
while (true) {
    int x = (int)(Math.random() * max) + min;
    System.out.println(x);
    if (x < min || x >= max) { break; }
}       

结果:

10
16
13
21 // Oops!!

在这里在线查看: ideone

你的:最低可能是分钟,最高可能是最高+分钟-1

Google:最低可能是分钟,最高可能是max-1

第一个生成错误范围内的数字,而第二个生成错误。

为了表明第一个是不正确的,让我们说min是10而max是20.换句话说,结果预计大于或等于10,严格小于20。 如果Math.random()返回0.75 ,则第一个公式的结果为25 ,超出范围。

如果min=10max=100

(int)(Math.random() * max) + min        

给出10到110之间的结果,而

(int)(Math.random() * (max - min) + min)

给出10到100之间的结果,因此它们是非常不同的公式 这里重要的是清晰度,所以无论你做什么,都要确保代码清楚地说明了生成的内容。

(PS。如果你将变量'max'更改为'range',第一个更有意义)

谷歌是对的:-)

Google的公式会在: min和max之间创建数字您的公式会在: min和(min + max)之间创建数字

int i = (int) (10 +Math.random()*11);

这将给你10到20之间的随机数。

这里的关键是:

a + Math.random()*b

起始编号(10)和结束编号是最大编号(20) - a(10)+ 1(11)

请享用!

如果min = 5max = 10 ,并且Math.random()返回(几乎)1.0,则生成的数字将(几乎)为15,这显然大于所选的max

相关地,这就是为什么每个随机数API都应该允许您明确指定min和max。 您不应该编写与您的问题域相关的容易出错的数学。

您在Google上找到的公式存在一个小问题。 它应该是:
(int)(Math.random() * (max - min + 1) + min)

(int)(Math.random() * (max - min) + min)

max - min + 1是可以生成随机数的范围

的Math.random()

返回带有正号的double值,大于或等于0.0且小于1.0。

现在它取决于你想要完成什么。 例如,当您想要从1到100的数字时,您只需要添加

(int)(Math.random()*100)

所以100是值的范围。 如果要将范围的开头更改为20到120,则必须在结尾添加+20。

所以公式是:

(int)(Math.random()*range) + min

而且你总是可以用max-min来计算范围,这就是为什么谷歌会给你这个公式。

Math.random()生成一个介于0(包括)和1(不包括)之间的数字。

所以(int)(Math.random() * max)范围从0max-1含)。

然后(int)(Math.random() * max) + min范围从minmax + min - 1 ,这不是你想要的。

谷歌的公式是正确的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM