【问题标题】:Math.random and arithmetic shift数学随机和算术移位
【发布时间】:2013-03-26 05:42:16
【问题描述】:

如果我在 JavaScript 中有以下代码:

var index1 = (Math.random() * 6) >> 0;
var index2 = Math.floor(Math.random() * 6);

index1index2 的结果介于 06 之间。

我一定对我对>> 运算符的理解感到困惑。我认为通过使用arithmetic shiftindex1 的结果将介于16 之间。

我注意到,但是如果我使用 >> 运算符,我不需要将 Math.floor()Math.round() 用于 index1

我知道我可以通过将1 添加到两个索引来实现这一点,但我希望有更好的方法来确保结果从16 而不是添加1

我知道bitwise operators 将其操作数视为 32 位(零和一)的序列,而不是十进制、十六进制或八进制数。例如,十进制数字 9 的二进制表示为 1001。按位运算符在这种二进制表示上执行操作,但它们返回标准的 JavaScript 数值。

更新:

我在第 26 行看到了这个 CAAT tutorial 的原始用法,我想知道这是否真的会返回一个介于 16 之间的随机数,而且它似乎只会永远返回06 之间的随机数。所以你永远不会真正看到anim1.pngfish 图像!

提前感谢您的任何启发。

【问题讨论】:

  • 您不应该在 javascript 中使用位运算符。数字被实现为 64 个浮点数,并在内部转换为 32 位整数以进行操作,然后再返回。 i-programmer.info/programming/javascript/…
  • @Walkerneo 感谢您的链接。我会好好阅读的。
  • 请注意,The Signed Right Shift Operator 算法的第 5 步使用内部 ToInt32 方法将值转换为整数。
  • @Walkerneo — 这有点笼统。在这种情况下,也许 OP 没有明智地使用它,但是按位运算符有它们的用途。
  • @RobG,嗯,来自 Skeetman 本人:stackoverflow.com/a/261073/828584。编辑:如果你遇到过它们,仍然对任何其他用途感兴趣。

标签: javascript bit-shift


【解决方案1】:

维基百科说“(负数的算术右移相当于在一些历史计算机使用的有符号数的补码表示中使用向 0 舍入的除法。)”

不完全是一个答案,但想法是 >> 0 是非常具体的,一般不应该用于获得 1 到 6 之间的范围。

大多数人会告诉你这样做

 Math.floor((Math.random()*10)+1);

【讨论】:

  • 对于1到6的范围,乘数不应该是6吗?或者使用 Math.ceil 和 5 的乘数。
猜你喜欢
  • 2014-11-15
  • 2010-10-15
  • 1970-01-01
  • 2011-04-11
  • 1970-01-01
  • 2014-03-10
  • 1970-01-01
  • 2020-07-02
  • 2018-07-27
相关资源
最近更新 更多