crypto.getRandomValues(new Uint32Array(1))[0] / lim 可以是负数吗?
Can crypto.getRandomValues(new Uint32Array(1))[0] / lim ever be negative?
想知道表达式 crypto.getRandomValues(new Uint32Array(1))[0] / lim
是否可以为负数。
我正在转换的代码在其周围放置了一个 Math.abs
包装器,但我们中的一些人认为它不可能为负数,所以只是想看看你们其他人的想法?
var lim = Math.pow(2, 32) - 1;
crypto.getRandomValues(new Uint32Array(1))[0] / lim);
这是有关更多上下文的相关问题:
该库有一个 getRandomValue()
nodejs 函数,如下所示:
import * as crypto from "crypto"
var lim = Math.pow(2, 32) - 1;
export function getRandomValue () {
return Math.abs(crypto.randomBytes(4)
.readInt32BE(0) / lim)
}
我认为对于浏览器,Math.abs
调用被保留了,尽管它似乎没有必要,而且很可能是不正确的。
在这种情况下,使用 Math.abs()
将是 错误的!
上面的声明说,所讨论的值是 UInt32
... 无符号 32 位整数。
这只是意味着最左边的位(最高有效位)不会被解释为符号位。但是,这不会阻止您在某些上下文中无意中使用该值, 会 假设 MSB=1
意味着 "negative."
尽管如此,您使用 abs()
是 错误的 因为这会转换整个位模式,如果它发现 MSB=1
,变成一个完全不同的位模式。由于 MSB 只是 "one of the 32 bits which comprises the value," ,因此假设它是一个符号位而对它做任何事情都是错误的。而且您还需要注意它永远不会显示为负数,因为它不是。这个数量是 32 位长,而不是 31+符号。确保它看起来总是那样。
想知道表达式 crypto.getRandomValues(new Uint32Array(1))[0] / lim
是否可以为负数。
我正在转换的代码在其周围放置了一个 Math.abs
包装器,但我们中的一些人认为它不可能为负数,所以只是想看看你们其他人的想法?
var lim = Math.pow(2, 32) - 1;
crypto.getRandomValues(new Uint32Array(1))[0] / lim);
这是有关更多上下文的相关问题:
该库有一个 getRandomValue()
nodejs 函数,如下所示:
import * as crypto from "crypto"
var lim = Math.pow(2, 32) - 1;
export function getRandomValue () {
return Math.abs(crypto.randomBytes(4)
.readInt32BE(0) / lim)
}
我认为对于浏览器,Math.abs
调用被保留了,尽管它似乎没有必要,而且很可能是不正确的。
在这种情况下,使用 Math.abs()
将是 错误的!
上面的声明说,所讨论的值是 UInt32
... 无符号 32 位整数。
这只是意味着最左边的位(最高有效位)不会被解释为符号位。但是,这不会阻止您在某些上下文中无意中使用该值, 会 假设 MSB=1
意味着 "negative."
尽管如此,您使用 abs()
是 错误的 因为这会转换整个位模式,如果它发现 MSB=1
,变成一个完全不同的位模式。由于 MSB 只是 "one of the 32 bits which comprises the value," ,因此假设它是一个符号位而对它做任何事情都是错误的。而且您还需要注意它永远不会显示为负数,因为它不是。这个数量是 32 位长,而不是 31+符号。确保它看起来总是那样。