我希望找到一种用随机浮点数填充数组的方法。我的数组大小为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;
}
}
答案 0 :(得分:10)
如果 C ++ 11 是一个选项,我会使用random标题和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 ;
}
Why do people say there is modulo bias when using a random number generator?解释了为什么天真地使用模数rand()
会导致分布偏差以及如何避免它。
答案 1 :(得分:3)
如果C ++ 11不是一个选项,你只需使用rand
,将其结果除以RAND_MAX
常量转换为float
,以获得均匀分布的浮点数。范围[0,1];然后你可以将它乘以24并加1以得到你想要的范围:
myArray[i] = rand()/float(RAND_MAX)*24.f+1.f;
顺便说一下,正如其他观察到的那样,将srand
移出你的循环 - RNG种子(通常)必须只初始化一次。
(请注意除以RAND_MAX
会给出包含区间右侧的分布;如果要排除它,则应除以RAND_MAX+1
)
当然,得到的分布仅与原始rand()
分布一样好(无论是随机性还是粒度);您通常会得到LCG并且粒度至少为0.0007(由标准保证,以及VC ++和其他编译器实际提供的内容)。如果您需要更好的随机数,您应该遵循其他答案中公布的建议(C ++ 11中的默认Mersenne twister生成器提供更好的随机性和更大的保证范围)。
答案 2 :(得分:1)
#include <random>
...
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_real_distribution<float> dist(1.0f, 25.0f);
std::cout << dist(gen);
答案 3 :(得分:1)
每次for循环迭代时,它会在数组中为一个随机数分配一个值。由于您的数组大小为50,因此您希望迭代50次而不是像现在这样迭代25次。
for(int i = 0; i < 50; i++)
数组边界从0开始,因此您只能从数组[0]访问数组[49]。
要获得1-25的随机数,您需要
myArray[i] = rand() % 25 + 1;
另外,你想要整数还是浮点随机数?现在你只是得到整数,分别是1,2,3,...... 25.如果你想要像2.45,6.883,23.999等等,你需要做一些不同的事情。有关答案,请参阅C++ random float number generation。
您可能不希望每次在数组中插入数字时都暂停。在for循环之后移动它。
system("pause");
此外,如果你在for循环中return 0
,你只会在程序退出之前分配一个数字。将其移动到循环之后。
答案 4 :(得分:0)
使用uniform_real。在以下程序中,生成1.0到2.0之间的随机浮点数:
#include <random>
#include <iostream>
typedef std::ranlux64_base_01 Myeng;
typedef std::uniform_real<float> Myceng;
int main()
{
Myeng eng;
Myceng ceng(1.0, 2.0);
Myceng::input_type engval = eng();
std::cout << "a random value == " << ceng(eng) << std::endl;
std::cout << "a random value == " << ceng(eng) << std::endl;
std::cout << "a random value == " << ceng(eng) << std::endl;
return (0);
}