如何使用随机浮点数填充数组?

sta*_*e12 1 c++ arrays random floating-point

我希望找到一种用随机浮点数填充数组的方法.我的数组大小为50,我希望用1-25范围内的随机浮点数填充此数组.这是我到目前为止所拥有的.我非常感谢任何人可以提供的任何提示或答案.谢谢.

#include <iostream>

#include <ctime>

#include <cstdlib>

using namespace std;


int main()

{

float myArray[50];


for(int i = 1; i <= 25; i++)

{

srand(time(0));


myArray[i] = (rand()% 50 + 1);

cout << myArray[i] << endl;



system("Pause");

return 0;

} 

}
Run Code Online (Sandbox Code Playgroud)

Sha*_*our 10

如果C++ 11是一个选项,我会使用random header和uniform_real_distribution:

#include <iostream>
#include <random>

int main()
{
    std::random_device rd;

    std::mt19937 e2(rd());
    std::uniform_real_distribution<> dist(0, 25);

    for (int n = 0; n < 50; ++n) {
        std::cout << dist(e2) << ",";
    }
    std::cout << std::endl ;
}
Run Code Online (Sandbox Code Playgroud)

为什么人们说使用随机数发生器时存在模偏差?解释了为什么天然使用模数rand()会导致分布偏差以及如何避免它.


Mat*_*lia 5

如果 C++11 不是一个选项,您可以使用rand,将其结果除以转换为的RAND_MAX常量float以获得范围 [0, 1] 内的均匀分布的浮点数;然后您可以将其乘以 24 并加 1 以获得所需的范围:

myArray[i] = rand()/float(RAND_MAX)*24.f+1.f;
Run Code Online (Sandbox Code Playgroud)

顺便说一句,正如其他人所观察到的那样,srand退出循环 - RNG 种子(通常)必须仅初始化一次。

(请注意,除以RAND_MAX将给出包含区间右极值的分布;如果您想排除它,您应该除以例如RAND_MAX+1


当然,结果分布只和原始rand()分布一样好(无论是随机性还是粒度);您通常会获得至少 ~0.0007的LCG和粒度(由标准保证,以及 VC++ 和其他编译器实际提供的内容)。如果您需要更好的随机数,您应该遵循其他答案中发布的建议(C++11 中的默认梅森扭曲器生成器提供更好的随机性和更大的保证范围)。