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+符号。确保它看起来总是那样。