为了生成随机数,我使用了公式:
(int)(Math.random() * max) + min
我在Google上找到的公式似乎总是:
(int)(Math.random() * (max - min) + min)
哪一个对吗?据我所知,我的公式
从未得到超出我的范围的数字答案 0 :(得分:15)
您的公式会在最小值和最小值+最大值之间生成数字
Google发现的那个会在最小和最大之间生成数字。
Google赢了!
答案 1 :(得分:10)
更好的方法是:
int x = rand.nextInt(max - min + 1) + min;
您的公式会在min
和min + 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
答案 2 :(得分:5)
你的:最低可能是分钟,最高可能是最高+分钟-1
Google:最低可能是分钟,最高可能是max-1
答案 3 :(得分:2)
第一个生成错误范围内的数字,而第二个生成错误。
要显示第一个不正确,我们假设min
为10而max
为20.换句话说,结果预计大于或等于10,严格减少二十多岁。如果Math.random()
返回0.75
,则第一个公式的结果为25
,超出范围。
答案 4 :(得分:2)
如果min=10
和max=100
:
(int)(Math.random() * max) + min
给出10到110之间的结果,而
(int)(Math.random() * (max - min) + min)
给出10到100之间的结果,所以它们是非常不同的公式。这里重要的是清晰度,所以无论你做什么,都要确保代码清楚地说明了生成的内容。
(PS。如果将变量'max'更改为'range',第一个更有意义)
答案 5 :(得分:2)
谷歌是对的: - )
Google的公式会在以下各项之间创建数字:分钟和最大值 您的公式会在以下各项之间创建数字: min和(min + max)
答案 6 :(得分:2)
int i = (int) (10 +Math.random()*11);
这将为您提供10到20之间的随机数。
这里的关键是:
a + Math.random()*b
起始编号(10)和结束编号是最大编号(20) - a(10)+ 1(11)
享受!
答案 7 :(得分:1)
如果min = 5
,max = 10
和Math.random()
返回(差不多)1.0,则生成的数字将(几乎)为15,这显然超过了选定的{{1} }。
相关地,这就是每个随机数API应该允许您明确指定min和max的原因。您不应该编写与您的问题域相关的容易出错的数学。
答案 8 :(得分: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计算范围,这就是Google为您提供该公式的原因。
答案 9 :(得分:1)
您在Google上找到的公式存在一个小问题。
它应该是:
(int)(Math.random() * (max - min + 1) + min)
不
(int)(Math.random() * (max - min) + min)
。
max - min + 1
是可以生成随机数的范围
答案 10 :(得分:0)
Math.random()
生成一个介于0(含)和1(独占)之间的数字。
所以(int)(Math.random() * max)
的范围从0
到max-1
。
然后(int)(Math.random() * max) + min
的范围从min
到max + min - 1
,这不是您想要的。
Google的公式是正确的。