Math.floor(Math.random()) +1实际上是做什么?

6

当你使用 Math.floor(Math.random()*10)+1 时,根据我所理解的,它应该在1-10之间随机选择一个数字。

然而,当我将 +1 改成任何比 1 更高或更低的数字时,我得到相同的结果。为什么会这样? +1 究竟是什么意思?


2
如果您在“+1”之外增加了其他内容,但仍然得到1-10之间的数字,则表示出现了严重问题。 - Dave Newton
(为了澄清-如果您始终且仅始终获得1-10之间的数字。显然,任何给定的运行可能只产生1-10,但随着时间的推移,这几乎肯定不会是这种情况。) - Dave Newton
这个问题基于错误的前提。我认为你知道加1的作用,但是你的代码可能存在其他问题。如果你有这样的问题,请发布你的实际代码。当我改变+1时...我得到相同的结果。 - user1106925
@DaveNewton: http://dilbert.com/strips/comic/2001-10-25/ - user1106925
@user1485897,你明确询问了“+1”的含义,并声称它没有任何区别;除了认为你是错误的或者出现了严重问题,我们还能得出什么结论呢?“那个巨魔”要求你提供具体代码,这是恰当的回应。 - Dave Newton
显示剩余2条评论
4个回答

9
随机数生成器会产生在0.0 <= n < 1.0范围内的值。如果你想要一个1到某个数字之间的数,你需要应用+1的偏移量。通常可以使用以下代码:
Math.floor(Math.random() * N) + M

这将生成M到M + N - 1之间的值。 演示Fiddle

3
不完全正确:由于使用了Math.floor,因此数字范围在M和M+N-1之间。你需要使用Math.round才能获得M和M+N之间的数字。然而,在这种情况下,分布不是均等的,因为M和M+N只有一半的机会被选中。 - Christoph
你说得对。我所说的“between”是指“包括起始值但不包括结束值”,从技术上讲,就是M <= n < M+N范围内的值。 - tadman
@Christoph 刚刚从谷歌搜索中发现了这篇文章,直到我看到你的评论,我才完全理解 Math.floor((Math.random() * N) + M) 的工作原理。所以,谢谢! - Partack

3

整数是介于1和10之间的数字。

  • Math.random() 生成0到1之间的数字(带有许多小数位)。

例如:
math.random() [随机返回:0.19157057767733932]
(此数字仍将具有许多小数位)

要获取随机整数,需要将生成的随机数字乘以10。

例如:
math.random()*10 = [随机返回:2.9757621488533914]

  • 由于数字仍将具有许多小数位,因此使用 floor() 方法将数字向下舍入/最接近整数,这将给出一个介于0和9之间的值。然后,您可以加1使其成为介于1和10之间的数字。

例如:
math.floor(0.6) [返回0]
math.floor(0.6)+1 [返回1]


3
Math.random() 生成 0 到 1 之间的随机数。
因此,Math.random()*10 生成 0 到 10 之间的随机数,而 (Math.random()*10)+1 生成 1 到 11 之间的随机数。 Math.floor() 去除这个数的小数部分,并将其变为从 0 到 10 的整数。
您可以在这里看到逻辑的连续进展。

4
Math.random()也可以生成0.9999...。确切地说, Math.random()生成一个介于(包含)0和(不包含)1之间的数字。 - Rob W
好的观点 - 已相应更新答案。是的,但是有什么东西真正地是“随机”的呢! - jacktheripper
0.9940599762680827 是一个大于 0.9 的浮点数,对吧? - Salman A
@jacktheripper 这取决于你的定义以及你是否能够预测量子力学的结果。 - Dave Newton
@SalmanA 嗯...是的,没错。不过我不确定我理解你的观点。 - Dave Newton
显示剩余2条评论

0

基础:

(random() >= 0) 总是 true

(random() < 1) 总是 true

(Math.floor(random()) == 0) 总是 true

最大值:

(Math.floor(random() * 10) >= 0) 总是 true

(Math.floor(random() * 10) < 10) 总是 true

最小值:

(Math.floor(random() * 10) + 1 >= 1) 总是 true

(Math.floor(random() * 10) + 1 < 11) 总是 true

最大舍入值:

(Math.round(random() * 10, 0) >= 0) 总是 true

(Math.round(random() * 10, 0) <= 10) 总是 true


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