Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中带有Math.Random()的随机数_Java_Random - Fatal编程技术网

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);如果您或任何其他人认为这是错误的,请随意评论。