【问题标题】:What is the point of Math.random() returning from 0 inclusive to 1 exclusive?Math.random() 从 0 包含返回到 1 不包含有什么意义?
【发布时间】:2016-10-02 12:10:15
【问题描述】:

Math.random() 在我的控制台中返回一个二进制点后 17 位的数字,因此它恰好为 0 的概率非常低。当它基本上永远不会返回其中任何一个数字时,它在技术上可以为 0 但永远不能为 1 到底有什么意义?是什么导致了这个?有人可以给我一些Math.random() 的这个属性相关的例子吗?

【问题讨论】:

  • 见过Math.floor(Math.random()*N)?我们绝对不想让N 回到那里。
  • the probability of it being exactly 0 is astronomically low 随机性的关键是不可预测的。
  • "恰好为 0 的概率非常低" - [0,1) 中任何其他值的概率也是如此
  • @BoltKey:当然它会改变一些东西——得到0 的概率会更小,并且小于得到数字 1…N-1 的概率。我承认,差别不大,但鉴于 JavaScript 数字的数量有限,它仍然存在差异。
  • @BoltKey:这使得它不再被正确分发 - 包括0 微不足道地解决了这个问题,所以这就是它完成的原因。

标签: random


【解决方案1】:

通常要生成随机浮点值,首先生成一个随机整数,然后将其缩放到浮点范围。由于浮点值的二进制表示,因此在 0 和 1 之间存在 2 的幂的均匀分布值,不包括 1.0。如果您确实包含 1.0,则范围是二加一的幂;而在这样的范围内生成一个统一的随机整数则要困难得多。

除此之外,返回 1.0 只会导致问题。在你将它乘以一个常数之后,你最终有一个非常小的机会,但仍然有机会得到这个常数。即使在使用四舍五入量化之后,与任何其他值相比,您仍然只能获得一半的发生机会(除了零,它也会受到同样的惩罚)。

所以这样做更容易,也更有用。

也就是说,这不是对完美均匀分布大惊小怪的地方。只需将一个浮点值(本质上仅限于某些有限值集)乘以一个常数并量化结果,您最终会得到一些结果比其他结果稍微(不可估量)更多的可能性。

【讨论】:

    猜你喜欢
    • 2018-11-25
    • 2020-10-12
    • 2022-01-22
    • 1970-01-01
    • 2012-05-14
    • 2021-12-20
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    相关资源
    最近更新 更多