`glm::linearRand(-1.0f, 1.0f)`,给出的负数多于正数。这是为什么? `rand` 看起来不错

`glm::linearRand(-1.0f, 1.0f)`, gives more negative numbers than positive. Why is that? `rand` seems ok

我正在使用 glm::linearRand(-1.0f, 1.0f) 生成介于 -11 之间的随机浮点数。之后,我输出正数(0.0f 或以上)的百分比。

std::srand(time(0)); // Give glm a new seed

uint32_t samples = 1000000000;
uint32_t positive = 0;
uint32_t negative = 0;

for (uint32_t i = 0; i < samples; i++) {
    float rand = glm::linearRand(-1.0f, 1.0f);

    if (rand >= 0.0f) {
        positive++;
    } else {
        negative++;
    }
}

std::cout << "positive %: " << std::setprecision(6) << ((float)positive / samples) * 100 << std::endl;

正数的百分比总是在 49.6% 左右结束,无论我 运行 程序有多频繁(使用不同的种子!)。如果我正确理解浮点数,-1.0f0.0f 之间的数量与 0.0f1.0f 之间的数量一样多。

那么为什么这个程序生成的负数总是多于正数?

注意 this test codeBob__ 提供(他、IkarusDeveloperMarek R 之间交换意见的结果)。 这证明这次 rand 没有问题,但是 glm::linearRand.

内部的浮点数舍入有一些问题

这是 GLM 中的一个错误。虽然关于将 %rand 一起使用的通常警告是范围不会平均划分 RAND_MAX,但此代码选择减少 rand() 模数的 more straightforward approach UINT8_MAX,因此 从未 生产 255。每个随机值最终都是通过组合几个这样的字节得出的,因此 127/255=49.8% 的值将位于上半部分(此处为正数)。