`glm::linearRand(-1.0f, 1.0f)` 给出的负数多于正数。这是为什么?“兰德”似乎没问题

Nae*_*sis 5 c++ random glm-math

我用来生成和glm::linearRand(-1.0f, 1.0f)之间的随机浮点数。然后,我输出正数(或以上)的百分比。-110.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;
Run Code Online (Sandbox Code Playgroud)

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

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

请注意(他和之间评论交换的结果)提供的测试代码。这证明这次不是问题,但是 的内部浮点数舍入存在一些问题。Bob__IkarusDeveloperMarek Rrandglm::linearRand

Dav*_*ing 4

这是 GLM 中的一个错误%虽然关于使用with的常见警告rand是范围不能均匀划分 \xe2\x80\x99t RAND_MAX,但此代码选择更直接的减少rand()modulo的方法UINT8_MAX,因此永远不会生成 255 。每个随机值最终都是通过组合几个这样的字节而得出的,因此 127/255=49.8% 的值将位于上半部分(此处为正)。

\n