【问题标题】:Random numbers and floor vs round function随机数和地板与舍入函数
【发布时间】:2011-11-14 17:14:16
【问题描述】:

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

【问题讨论】:

  • 你能添加示例代码吗? (以及额外的功劳,一些比较两者并证明问题的统计数据)

标签: javascript


【解决方案1】:

我真的很喜欢通过执行二进制“或 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() 需要额外的步骤(因为传播是1ar.length 而不是0ar.length-1

【讨论】:

  • 你怎么知道它稍微快一点,原谅我的无知,什么是堆栈与堆?我知道他们与排序算法有关
  • jsperf.com/random-array-item 表明它在我的浏览器上稍快(在 Mac Chrome 版本 58.0.3029.110(64 位)上平均约为 ±0.5% - x±0.8%)这里更多关于堆栈/heap: stackoverflow.com/questions/79923/… |0 将其强制为 int32 (四舍五入并键入),以便它可以放在堆栈中,而一般数字总是在堆中(以防它们最终变大或有小数点。)
  • 速度上的差别不是很大,但还是很小的,而且正如我所说,我觉得它看起来也不错。
  • 谢谢。一旦我有空闲时间,我将不得不阅读。我不知道您对“计算机内存”有任何控制权吗?使用 javascript(即 int32)就像使用 C 语言一样。还是我只是误解了这一点。
  • 这不是太多的控制,而是一种将内存使用量间接地集中到堆栈中的快速技巧。在这里查看更多信息:stackoverflow.com/questions/7487977/…
【解决方案2】:

Math.floor(Math.random() * 10) 给出了相当均匀的分布,而Math.round(Math.random() * 10) 则没有。

Math.floor() 为 [0, 1) 范围内的任何值返回 0(1 除外),为 [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 ║
╚═════════╩═════════╩═════════╝

【讨论】:

  • 是的,这就是我目前正在做的事情。但我要问为什么没有地板,这种分布不像有地板那样均匀。
  • 想象方格纸上的一条线,长 10 个正方形。左边 0,右边 10,中间右边 5。如果你使用round(),那么5左边半个正方形的区域, 5右边半个正方形的区域将映射到5。但是,只有0的半个正方形映射到0,这条线上没有0的半个正方形。当你使用 floor() 时,只有 n 右侧一平方的值会映射到 n,你会减少可能结果的数量,因为你不能再得到 10。但是,10 种可能的结果(0-9 英寸)中的每一种都具有相同的“份额”,因此发生的几率相同。
  • Math.round(Math.random()) 在一种情况下是准确的,但是:当你“掷硬币”时,即想要 0 或 1。
  • 这是否适用于以下算法Math.round(Math.random() * 10 + 1)
猜你喜欢
  • 1970-01-01
  • 2021-05-25
  • 2022-08-18
  • 1970-01-01
  • 2020-10-01
  • 1970-01-01
  • 2014-12-25
  • 2013-06-27
  • 2017-06-26
相关资源
最近更新 更多