当前位置: 首页 > 知识库问答 >
问题:

Math.Random返回0的几率有多大?

阮才俊
2023-03-14

和这个问题的提问者一样,我也想知道为什么Math.ceil(Math.random()*10)不比Math.floor(Math.random()*10)+1更受欢迎,结果发现这是因为Math.random有很小(但相关的)机会准确返回0。但有多小?

进一步研究告诉我,这个随机数精确到小数点后16位……嗯,算是吧。而这正是我所好奇的“那种”。

我知道浮点数和小数的工作原理不同。但我很纠结细节。如果这个数字是一个严格的十进制数值,我相信几率会是十分之一的台球(或者在美国的系统中是十分之一的)--1:1016

这是正确的,还是我搞砸了,还是浮点的东西有什么不同?

共有1个答案

甄成弘
2023-03-14

JavaScript是ECMAScript的一种方言。ECMAScript-262标准无法精确指定math.random。第20.2.2.7条规定:

20.2.2.27 Math.Random()

返回一个带正号的数值,大于或等于0但小于1,该数值是随机选择的或伪随机选择的,并且使用与实现相关的算法或策略在该范围内近似均匀分布。此函数不接受参数。为不同领域创建的每个Math.Random函数必须从连续调用中产生不同的值序列。

另一种选择是使用[0,1)中的所有可表示值,每个值的概率与从它到下一个可表示值的距离成比例。因此,[1/2,1)中的每个可表示数将以概率1/253被选择,[1/4,1/2)中的每个可表示数将以概率1/254被选择,[f1,1/4)中的每个可表示数将以概率1/255被选择,依此类推。该分布近似于一个均匀分布,并且在浮点格式更精细的地方提供更精细的精度。如果实现正确,则生成的概率零为21074中的一个。

另一种选择是使用[0,1)中的所有可表示值,每个值的概率与段的长度成比例,其中可表示值是段中所有实数的最近可表示值。我将省略对这个分布的一些细节的讨论,只是说它模拟了一个结果,即选择一个均匀分布的实数,然后使用舍入到最近的关系到偶数的规则将它舍入到一个可表示的值。如果正确实现,则生成的概率为21075中的一个。(此分布的一个问题是,[0,1)中的reals上的均匀分布有时会产生一个非常接近1的数字,以致四舍五入产生1。这就需要允许math.random返回1,或者以某种方式篡改分布,可能是返回下一个较低的可表示值,而不是1。)

我将注意到,ECMAScript规范非常宽松,以至于可以断言math.random可以以相等的概率为每个可表示值分配数字,而忽略它们之间的间距。这根本不会模拟真实数字的均匀分布,我估计很少有人会赞成它。然而,如果实施,返回的概率零是1021•252中的一个,因为有252归一化数,其指数从−53到−1074(e的1020个值),以及252次正态或零数。

 类似资料:
  • 问题内容: 现在在phpMyAdmin中工作: 表结构: 该表当前有4行数据,具有不同的OrderID。 SQL: 结果: 我期待第四行-只是一个数字,但是phpMyAdmin中的每一行都有一个0。 问题答案: 返回最后插入的行的ID,并且未绑定到任何表。因此,如果您创建一个新行: 它将返回最后一个id(新主键具有的任何值)。 有关详细信息,请查看 手册 : LAST_INSERT_ID()(不带

  • 我们都知道很古老的。它返回一个介于0和1之间的随机浮点数。 我似乎找不到任何证据来证明零或一是排他性的还是包容性的。

  • 我想知道创造概率的最好或最被接受的方法是什么。我做了一些研究,发现了一些关于Math.random()主题的有趣的问题和答案,例如: 例如,我知道是一种有用的方法,可以在将近50%的时间内生成1: -math.random()生成介于0(含)和1(不含)之间的随机数 -如果生成的数字<0.5,这个数字乘以2仍然会小于1,所以这个数字。floor()返回一个0

  • 问题内容: 以下代码仅产生0;-; 我究竟做错了什么? 编辑,另一张海报建议修复它。int croll = 1 +(int)(Math.random()* 4-1); 感谢大家! 问题答案: 你正在使用哪个州 返回带有正号(大于或等于0.0并小于)的值。 你正在将结果转换为,返回值的整数部分,即0。 然后 考虑使用

  • 问题内容: 我得到imageView的宽度0。下面是代码。 xml文件: 活动内容: 我不想使用下面的代码,因为我需要将此代码放置在很多地方。 我的解决方法: 实际上,我以后不需要在活动中添加此代码。我将其添加到非活动类中,而不是ImageView的宽度,而是使用了位图图像的宽度,现在没有此问题。 问题答案: 您在哪里打电话并在ImageView上打电话?如果您是在活动中打电话,则无法使用。您需要

  • 问题内容: 我知道有很多标题相同的主题。但是大多数情况是将查询插入了错误的位置。但是我认为我说对了。所以问题是,即使将数据插入数据库,我仍然会得到0。有人知道我可能是错的答案吗? 这是我的代码: 在此先多谢一遍,因为我几乎已经整整一天都为此而努力。(可能有点小而愚蠢) 问题答案: 根据手册 mysql_insert_id返回: 成功执行前一个查询为AUTO_INCREMENT列生成的ID; 如果前