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()
会导致分布偏差以及如何避免它.
如果 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 中的默认梅森扭曲器生成器提供更好的随机性和更大的保证范围)。