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

时间:2013-09-24 15:17:24

标签: 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;

} 

}

5 个答案:

答案 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); 
}