Java中带有Math.Random()的随机数
为了生成随机数,我使用了以下公式:Java中带有Math.Random()的随机数,java,random,Java,Random,为了生成随机数,我使用了以下公式: (int)(Math.random()*max)+min 我在谷歌上找到的公式似乎总是: (int)(Math.random()*(max-min)+min) 哪一个是对的?据我所知,我从未用公式计算出超出范围的数字更好的方法是: int x = rand.nextInt(max - min + 1) + min; 您的公式生成的数字介于min和min+max之间 Random random = new Random(1234567); int min =
(int)(Math.random()*max)+min
我在谷歌上找到的公式似乎总是:
(int)(Math.random()*(max-min)+min)
哪一个是对的?据我所知,我从未用公式计算出超出范围的数字更好的方法是:
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; }
}
请在此处联机查看:第一个生成的数字范围错误,而第二个是正确的
为了证明第一个是不正确的,我们假设
min
是10,max
是20。换句话说,结果应该大于或等于10,严格地说,应该小于20。如果Math.random()
返回0.75
,则第一个公式的结果为25
,超出范围。您的:最低可能值为min,最高可能值为max+min-1
谷歌:最低可能是最小,最高可能是最大-1你的公式生成的数字介于最小和最小+最大之间 谷歌找到的那个可以生成最小值和最大值之间的数字
谷歌赢了 如果
min=5
,和max=10
,以及Math.random()
返回(几乎)1.0,则生成的数字将是(几乎)15,明显大于所选的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; }
}
与此相关,这就是为什么每个随机数API都应该让您显式指定最小值和最大值。你不必编写与你的问题领域相切的容易出错的数学。如果
min=10
和max=100
:
(int)(Math.random() * max) + min
给出介于10和110之间的结果,而
(int)(Math.random() * (max - min) + min)
给出的结果介于10和100之间,因此它们是非常不同的公式。这里重要的是清晰,所以无论您做什么,都要确保代码清楚地显示生成了什么
(注:如果将变量“max”改为“range”,则第一个更有意义。)谷歌是对的:-)
谷歌的公式创建的数字介于:min和max之间
您的公式创建的数字介于:min和(min+max)Math.random()
生成的数字介于0(包含)和1(排除)之间
因此(int)(Math.random()*max)
的范围从0
到max-1
不等
然后(int)(Math.random()*max)+min
的范围从min
到max+min-1
,这不是您想要的
谷歌的公式是正确的
数学随机
返回一个带正号的双精度值,大于或等于
0.0且小于1.0
现在这取决于你想完成什么。例如,当你想得到从1到100的数字时,你只需要加上
(int)(Math.random()*100)
所以100是值的范围。如果要将范围的开始更改为20到120,则必须在末尾添加+20
所以公式是:
(int)(Math.random()*range) + min
你总是可以用max-min来计算范围,这就是为什么谷歌会给你这个公式
int i = (int) (10 +Math.random()*11);
这将给你10到20之间的随机数
这里的关键是:
a + Math.random()*b
起始数字(10)和结束数字是最大数字(20)-a(10)+1(11)
享受吧 你在谷歌上找到的公式有一个小问题。 应该是:
(int)(Math.random()*(max-min+1)+min)
不
(int)(Math.random()*(max-min)+min)
max-min+1
是可以生成随机数的范围Math.random()不会返回1,因为我确信在刷新页面时,六个寻求简单分数的答案会说:你的答案不正确。你的max
确实应该命名为range
或width
。你似乎是个幸运儿。Math.random()总是小于1.0。@F.J为了正确起见,我加了一个“几乎”;我选择1.0是因为它更容易理解带有整数的示例。为了完整性起见,当你说“完成”时,你的意思是包括min
和排除max
?嗨,Jason,看一下Javadoc的Math.random,它返回一个双精度>=0.0但<1.0。假设十进制精度如图所示(十分之一),(10+Math.random()*11将返回范围为10..19的值,而不是20。[Math.random()的最大值为0.9.0.9*11=9.9.10+9.9=19.9。强制转换int将其减少为19,因为这会截断19.9的值,而不是四舍五入(Math.round(double_val)将返回长值20)。因此,我认为要得到10..20的范围,您需要这样做:int I=(int)(10+Math.random()*12);如果您或任何其他人认为这是错误的,请随意评论。