解释这个 c++ 随机

Explain this c++ random

本文关键字:随机 c++ 解释      更新时间:2023-10-16

如本文所示,有几种方法可以在 c++ 中生成随机浮点数。但我不完全理解答案的第 3 个选项:

float r3 = LO + static_cast <float> (rand()) /( static_cast <float> (RAND_MAX/(HI-LO)));

有人可以向我解释这句话吗?这里的限额是如何计算的?

>rand()生成从0RAND_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_MAXHI-LO是整数,因此RAND_MAX/(HI-LO)被类型转换为float

rand()返回介于0RAND_MAX之间的内容。我们称之为r.

r / (RAND_MAX/(HI-LO)) = r / RAND_MAX * (HI-LO)所以这是在0HI-LO之间。

LO相加,您的值介于LOHI之间

static_casts 强制编译器转换为float,否则它将坚持ints 并弄乱计算。

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);