1

我希望找到一种用随机浮点数填充数组的方法。我的数组大小为 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;

} 

}
4

5 回答 5

10

如果C++11是一个选项,我会使用随机头和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 ;
}

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

于 2013-09-24T15:23:41.293 回答
5

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

myArray[i] = rand()/float(RAND_MAX)*24.f+1.f;

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

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


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

于 2013-09-24T15:28:54.777 回答
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);
于 2013-09-24T15:22:42.743 回答
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++ 随机浮点数生成

您可能不想在每次将数字插入数组时都暂停。在 for 循环之后移动它。

system("pause");

此外,如果你return 0在 for 循环中,你只会在程序退出之前分配一个数字。也将其移至循环之后。

于 2013-09-24T15:33:38.643 回答
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); 
}
于 2013-09-24T15:41:37.853 回答