解释这个 c++ 随机
Explain this c++ random
如本文所示,有几种方法可以在 c++ 中生成随机浮点数。但我不完全理解答案的第 3 个选项:
float r3 = LO + static_cast <float> (rand()) /( static_cast <float> (RAND_MAX/(HI-LO)));
有人可以向我解释这句话吗?这里的限额是如何计算的?
>rand()
生成从0
到RAND_MAX
的随机数。
0 <= rand()/RAND_MAX <= 1
implies: 0 <= rand()/RAND_MAX*(HI-LO) <= HI-LO
implies: LO <= LO + rand()/RAND_MAX*(HI-LO) <= HI
现在,由于RAND_MAX
和HI-LO
是整数,因此RAND_MAX/(HI-LO)
被类型转换为float
。
rand()
返回介于0
和RAND_MAX
之间的内容。我们称之为r
.
r / (RAND_MAX/(HI-LO)) = r / RAND_MAX * (HI-LO)
所以这是在0
和HI-LO
之间。
LO
相加,您的值介于LO
和HI
之间
static_cast
s 强制编译器转换为float
,否则它将坚持int
s 并弄乱计算。
STL先生在他的演讲"rand()被认为是有害的"中解释了为什么这(以及其他rand()
相关的结构)是一个非常糟糕的主意。
该代码背后的想法是使用浮点数来减少由模运算固定的随机数的熵损失。
正如斯蒂芬所指出的,浮点解没有模运算引入的问题(基本上,由于模,有一个值区间比其他值产生概率更大,这削弱了rand()
的理论均匀性)。但是浮点带来了一个新问题:在从
浮点类型到用户期望的整数类型的最终转换中产生的舍入会导致以下问题:对于不同的输入,相同的数字会多次生成,但只有几个值是由一个生成的。因此,再次失去了统一性。 当然,如果目标是生成随机浮点数,则舍入不是问题,就像您的情况一样。但是执行的四舍五入和除法也可能导致分布的均匀性被打破。
上述所有问题的结论是:该代码试图解决经典模法的均匀性问题,但导致(更少?我不确定)均匀性问题也是如此。因此,请尝试用其他库替换 C 随机工具(如自 C++11 以来提供的标准<random>
库)。
它试图在 [LO, HI] 范围内生成一个随机数
在 C++11 中执行此操作的更好方法是使用<random>
库:
std::default_random_engine generator;
std::uniform_real_distribution<double> distribution(LO,HI);
double value = distribution(generator);
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 为什么 Serial.println(<char[]>);返回随机字符?
- 字符串-C++后显示的随机字符
- 循环中的随机函数
- 在c++构造函数中使用随机字符串生成器
- 使用std::mt19937从字符串中返回一个随机单词
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- 如何在C++中高效地构造随机骰子
- 在类中使用随机生成器时出现性能问题
- 在将数字随机生成为数组期间从内存输出随机数的数组
- 将字符随机转换为大写的函数
- 为什么 vector 的随机访问迭代器给出与指针不同的内存地址?
- 如何生成一个随机的 n 位数,其中 n 是任意的
- 将随机生成的数字添加到数组 + 对这些数组求平均值
- 如何使用要传递给 mt19937 的可选随机种子参数设计函数
- 在C++中随机生成 20 个非重复数字
- GCC:随机构建导致执行期间分段错误
- 如何使用 SML 随机生成八进制元组
- 当我尝试使用它时,Scanf 会抛出一个随机异常(scanf_s 也是如此)
- 将正态随机变量与任意 RHO(corrcoef) 相关联