Math.floor(Math.random() * 5 + 1)的概念是什么?它的真实范围是多少?为什么?

6
通过将随机数(在0和1之间)乘以5,我们使其成为0到5之间的随机数(例如3.1841)。Math.floor()将此数字向下舍入为整数,并在末尾添加1将范围从0到4更改为1到5(包括5在内)。
上面的解释让我很困惑...我的理解如下:
--添加5使它具有5个数字的范围 --但它从0开始(就像一个数组?) --因此它技术上是0-4 --通过添加1,使其变为1-5
我非常新于JS,甚至不知道是否适合在这里提问,但是这个网站迄今为止非常棒。谢谢您的任何帮助!

1
我看到一些答案说rand函数的规范中0是不包括在内的:random() 返回一个正数、大于等于0.0并且小于1.0的double值。http://docs.oracle.com/javase/7/docs/api/java/lang/Math.html#random() - Culyx
@Culyx 这是一个 JavaScript 的问题,不是 Java! - Ram
1
@BlackSheep 对不起,我拿错了链接,正在检查两个 =P 但是观点仍然有效:random() 方法返回从0(包括)到1(不包括)之间的随机数。http://www.w3schools.com/jsref/jsref_random.asp - Culyx
4个回答

6
Mozilla 开发者网络Math.random()文档中得知:

Math.random()函数返回一个浮点数,并且是伪随机数,范围是[0, 1)即从0(包括)到但不包括1(不包括1)。

下面是两个例子随机生成的数字:
Math.random() // 0.011153860716149211
Math.random() // 0.9729151880834252

因此,当我们将随机生成的数字乘以另一个数字时,它的范围将从0到比被乘数小1的最大值(因为Math.floor()只是移除小数点而不是四舍五入数字(也就是说,0.999在使用Math.floor()处理时会变成0,而不是1))。

Math.floor(0.011153860716149211 * 5) // 0
Math.floor(0.9729151880834252 * 5)   // 4

只需加1,就可以把它偏移到您需要的值:

Math.floor(0.011153860716149211 * 5) + 1 // 1
Math.floor(0.9729151880834252 * 5) + 1   // 5

2

Math.Random() 返回一个介于 0 和 1 之间的数字,但不包括 1。

因此,当您将其乘以 5 时,您会得到介于 0 和 5 之间的数字,但不包括 5。

对此数字使用 Math.floor() 向下舍入为整数。

因此,您将得到的数字是 0、1、2、3 或 4。

在这个范围中加上 1,就可以得到 [1、2、3、4、5] 中的一个数字。


0
请注意:
  • 0 <= Math.random() **<** 1
  • Math.floor(x.yz) = x
因此,给定的数字是在以下区间内的整数:
x = Math.floor((0..0.999999999) * 5 + 1)
x = (0..4) + 1

0

15.8.2.14 Math.random 来自 ES5 规范,

返回一个正号的数字值,大于或等于 0 但小于 1,使用实现相关的算法或策略随机选择或伪随机选择,具有近似均匀分布。此函数不接受任何参数。

因此,

x = Math.random(); // 0 ≤ x < 1
y = x * 5;         // 0 ≤ y < 5
z = y + 1;         // 1 ≤ z < 6
i = Math.floor(z); // 1 ≤ i ≤ 5, i ∈ ℤ, ℤ integers

这意味着什么

i ∈ {1, 2, 3, 4, 5}

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