`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)
生成介于 -1
和 1
之间的随机浮点数。之后,我输出正数(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.0f
和 0.0f
之间的数量与 0.0f
和 1.0f
之间的数量一样多。
那么为什么这个程序生成的负数总是多于正数?
注意 this test code 由 Bob__
提供(他、IkarusDeveloper
和 Marek R
之间交换意见的结果)。
这证明这次 rand
没有问题,但是 glm::linearRand
.
内部的浮点数舍入有一些问题
这是 GLM 中的一个错误。虽然关于将 %
与 rand
一起使用的通常警告是范围不会平均划分 RAND_MAX
,但此代码选择减少 rand()
模数的 more straightforward approach UINT8_MAX
,因此 从未 生产 255。每个随机值最终都是通过组合几个这样的字节得出的,因此 127/255=49.8% 的值将位于上半部分(此处为正数)。
我正在使用 glm::linearRand(-1.0f, 1.0f)
生成介于 -1
和 1
之间的随机浮点数。之后,我输出正数(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.0f
和 0.0f
之间的数量与 0.0f
和 1.0f
之间的数量一样多。
那么为什么这个程序生成的负数总是多于正数?
注意 this test code 由 Bob__
提供(他、IkarusDeveloper
和 Marek R
之间交换意见的结果)。
这证明这次 rand
没有问题,但是 glm::linearRand
.
这是 GLM 中的一个错误。虽然关于将 %
与 rand
一起使用的通常警告是范围不会平均划分 RAND_MAX
,但此代码选择减少 rand()
模数的 more straightforward approach UINT8_MAX
,因此 从未 生产 255。每个随机值最终都是通过组合几个这样的字节得出的,因此 127/255=49.8% 的值将位于上半部分(此处为正数)。