Javascript 随机数与楼层与圆函数

Javascript 随机数与楼层与圆函数,javascript,Javascript,为什么如果我使用随机数生成器和范围0-9,我得不到与floor函数组合使用时相同的均匀分布?Math.floor(Math.random()*10)提供了相当均匀的分布,而Math.round(Math.random()*10)没有 floor()对[0,1](1互斥)范围内的任何值返回0,对[1,2]范围内的任何值返回1,以此类推 所以,如果我们有相同的机会得到这些范围中的一个数字,我们将得到0和1的相等分布 但是,Math.round()对于0.5以下的值返回0,对于1.5以下的值返回1,以

为什么如果我使用随机数生成器和范围0-9,我得不到与floor函数组合使用时相同的均匀分布?

Math.floor(Math.random()*10)
提供了相当均匀的分布,而
Math.round(Math.random()*10)
没有

floor()对[0,1](1互斥)范围内的任何值返回0,对[1,2]范围内的任何值返回1,以此类推

所以,如果我们有相同的机会得到这些范围中的一个数字,我们将得到0和1的相等分布

但是,Math.round()对于0.5以下的值返回0,对于1.5以下的值返回1,以此类推

所以我们实际上有一半的机会得到0,因为只有从0到0.5的值会四舍五入到0

╔═════════╦═════════╦═════════╗
║  Range  ║ floor() ║ round() ║
╠═════════╬═════════╬═════════╣
║ [0, 1)  ║ 0       ║ 0 or 1  ║
║ [1, 2)  ║ 1       ║ 1 or 2  ║
║ [2, 3)  ║ 2       ║ 2 or 3  ║
║ ...     ║ ...     ║ ...     ║
║ [9, 10) ║ 9       ║ 9 or 10 ║
╚═════════╩═════════╩═════════╝

我真的很喜欢通过执行二进制“或0”操作来触发31位int,而不是
Math.floor()
。这会使它稍微快一点(堆栈与堆),并且在实际意义上做同样的事情。下面是一个获取数组随机元素的示例:

var ar=[1,2,3,4,5,6,7,8,9,0,'a','b','c','d']
console.log(ar[(Math.random() * ar.length) |0])

这似乎是过早的优化,但正如我所说的,我喜欢它的外观,而且它比
Math.floor()
需要更少的输入。使用
Math.round()
需要额外的步骤(因为排列是
1
ar.length
而不是
0
ar.length-1

你能添加示例代码吗?(对于额外的信用,一些统计数据比较了两个问题并证明了这个问题)是的,这就是我现在正在做的。但是我问为什么没有这个分布不象地板一样均匀。想象一张图表纸上的一条线,10个长的方块,左边的0个,右边的10个,中间的5个。如果你使用圆(),则区域5的左半方和5的右半方将映射到5。但是,只有0的右半方映射到0,线上没有0的左半方。使用floor()时,只有n右边的一个正方形的值会映射到n。你减少了可能结果的数量,因为你不能再得到10个。但是,10个可能结果(0-9 inc)中的每一个都有相同的“份额”,因此发生的几率相同。
Math.round(Math.random())
在一种情况下是准确的:当你“掷硬币”,即想要0或1。对于以下算法
Math.round(Math.random()*10+1)
,这是否成立?您如何知道它稍微快一点?请原谅我的无知,堆栈与堆是什么?我知道他们与排序算法有关,这表明它在我的浏览器上稍微快一点(在Mac Chrome版本58.0.3029.110(64位)上,平均约为±0.5%-x±0.8%)这里有更多关于堆栈/堆的内容:
|0
强制它进入int32(对它进行取整并键入),这样它就可以位于堆栈中,而一般数字总是在堆中(以防它们最终变大或有小数点)这在速度上并没有太大的差别,但差别很小,正如我所说的,我觉得它看起来也不错。谢谢。一旦我有空闲时间,我就得读一下。我不知道你能用javascript(即int32)控制“计算机内存”就像你对C语言所做的那样。或者我只是误解了这一点。这不是太多的控制,而是一种快速的黑客行为,可以间接地将内存使用率引入堆栈。请参阅此处的更多信息: