【问题标题】:Random integer functions differences随机整数函数差异
【发布时间】:2014-10-26 13:25:25
【问题描述】:

检查一些代码,我发现了以下随机整数生成器函数:

function randomInt(min, max) {
    return min ? min : min = 0,
        max ? max : max = 1,
        0 | Math.random() * (max - min + 1) + min
}

MDN的等效函数比较:

// Returns a random integer between min (included) and max (excluded)
// Using Math.round() will give you a non-uniform distribution!
function getRandomInt(min, max) {
  return Math.floor(Math.random() * (max - min)) + min;
}

我知道第一个创建和包含 max 的整数,并且它检查值或将它们分配默认为 minmax 但我不明白它如何返回整数而不是浮点数没有Math.floor() 方法。

是使用0 | Math.random() * (max - min + 1) + min 表达式实现的吗?如果有,怎么做?

【问题讨论】:

  • 是否它只返回整数?
  • 天哪,多么糟糕的代码。作为条件操作数的赋值。 *抱住鼻子*
  • @caruso_g:事实上,((Math.random() * (max - min)) | 0) + min 将是 randomInt 的相当标准版本,尽管在现代引擎上它是 a bit slower
  • @caruso_g:没有添加,没有。 4.3 | 4 只是 4,例如,不是 8。如果任一操作数位为1,则单个位的或运算结果为1,否则为00 | 0 => 00 | 1 => 11 | 0 = > 1, 1 | 1 => 1。按位或运算符将其两个操作数转换为 32 位整数,然后对这 32 位中的每一个都执行此操作。在这种情况下,它将左操作数转换为整数,该整数将设置各种位;转换完全没有位设置的右操作数 (0);然后执行 OR,这意味着我们最终只得到左操作数的(下限)值。
  • @T.J.Crowder 啊哈,明白了。非常感谢您的帮助。

标签: javascript random


【解决方案1】:

使用| 运算符将结果转换为整数,即bitwise OR。来自MDN,计算结果的第一步是:

操作数被转换为 32 位整数并由一系列位(零和一)表示。

而且因为你是用 0 进行 ORing,所以这个操作不会改变结果的值(除了前面提到的转换)。

【讨论】:

  • 谢谢你的回答,只是为什么你说“这个操作不会改变结果的值”,即使它实际上是从浮点数到整数?
  • 我的意思是,与 0 进行 ORing 不会改变按位结果,而不是与其他数字进行 ORing,例如1 | 总是会给你一个奇数。
  • 感谢您的评论。如果您可以在答案中添加说明,那就太好了。
  • @caruso_g 已经在你前面了。有关更多链接和说明,请参阅我的更新答案。
  • 非常感谢。无论如何,我已经将其标记为答案。 ;)
【解决方案2】:

0 | 是按位运算。
它对值没有影响(ORing 与零返回原始值),但是,像所有按位运算一样,它会截断为整数(按位运算对非整数没有意义)。

【讨论】:

  • 如你所知,在 js 中,它会将任何值(数字或非数字)转换为下限整数,任何非数字值都会给出 0。
  • 我也是,尽管“它对价值没有影响”并没有真正的意义(它确实有影响:它会破坏它)。但这并不意味着答案没有用。
  • @p.s.w.g 它最初是否陈述了不同的内容?如果不是,也看不出原因和你的一样。
  • @MartinSmith 我认为这个答案自首次发布以来根本没有被修改过。
猜你喜欢
  • 2014-03-25
  • 2022-06-10
  • 2011-06-26
  • 2017-06-26
  • 1970-01-01
  • 2019-09-12
  • 2021-12-29
  • 2013-05-08
  • 1970-01-01
相关资源
最近更新 更多