我正在尝试新的方法来生成随机数并将它们填入数组中。到目前为止,我已经完成了。
template<size_t SIZE>
void fill_array(array<int, SIZE>& a)
{
default_random_engine dre;
uniform_int_distribution<int> uid1(0, 1000);
for (int i = 0; i < a.size(); i++)
{
a[i] = uid1(dre);
}
}
我的主文件非常简单,看起来像这样
array<int, 10> a;
Array3 a1;
a1.fill_array(a);
a1.print_array(a);
我以为每次调试时我都设法得到随机数,但我每次都得到相同的数字。奇怪的是,有时我会得到不同的数字,但那时我必须多次调试以获得新的数字。我做错了什么?
答案 0 :(得分:3)
即使您使用std::random_device
,也无法保证每次都能获得不同的序列:
std :: random_device可以用a来实现 实现定义的伪随机数引擎,如果a 非确定性源(例如硬件设备)不可用 实施。在这种情况下,每个std :: random_device对象都可以 生成相同的数字序列。
例如,在Windows上使用较早的g ++实现stdlibc ++就发生了这种情况。
此外,由于性能问题,random_device
通常仅用于(一次)种子伪随机位生成器,例如Mersenne twister引擎(std::mt19937
)。
您的填充功能可以像这样实现:
#include <iostream>
#include <array>
#include <iterator>
#include <random>
#include <algorithm>
template< class Iter >
void fill_with_random_int_values( Iter start, Iter end, int min, int max)
{
static std::random_device rd; // you only need to initialize it once
static std::mt19937 mte(rd()); // this is a relative big object to create
std::uniform_int_distribution<int> dist(min, max);
std::generate(start, end, [&] () { return dist(mte); });
}
int main()
{
std::array<int, 10> a;
fill_with_random_int_values(a.begin(), a.end(), 0, 1000);
for ( int i : a ) std::cout << i << ' ';
std::cout << '\n';
}
现场演示HERE。
答案 1 :(得分:1)
这些内容:
#include <random>
#include <array>
#include <algorithm>
template<class Engine, class Integer, size_t SIZE>
void fill_array(Engine& eng, std::array<Integer, SIZE>& a, Integer lower = 0, Integer upper = 1000)
{
std::uniform_int_distribution<Integer> uid1(lower, upper);
std::generate(a.begin(), a.end(), [&]
{
return uid1(eng);
});
}
int main()
{
std::random_device rnd; // a source of machine-wide entropy
std::default_random_engine eng(rnd()); // use it to initialise the psuedo-random engine
std::array<int, 100> arr;
fill_array(eng, arr);
}
答案 2 :(得分:0)
我建议使用std :: vector而不是数组。如果您使用std :: rand函数,则可以使用srand(time(NULL));
随时间播种它。当然,您需要包含time.h。您可以使用generate(a.begin(), a.end(), rand);
填充向量,而无需使用循环。这将每次为您提供一个新的随机数序列。
答案 3 :(得分:-1)
您没有将种子初始化为随机值。所以你的随机发生器总是从相同的位置开始。
以下是如何初始化种子以从某个地方开始的示例。基本上你需要一些并不总是相同的源,所以你的生成器产生随机结果,时间是最常用的值。
#include <iostream>
#include <chrono>
#include <random>
int main ()
{
typedef std::chrono::high_resolution_clock clock;
std::default_random_engine generator(clock::now().time_since_epoch().count());
std::uniform_int_distribution<int> rand(0,1000);
for(int i = 0;i < 10;i++)
{
std::cout << rand(generator) << std::endl;
}
return 0;
}