我正在尝试新的方法来生成随机数并填充数组中。到目前为止,我已经完成了。
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);
我以为每次调试时都设法获得随机数,但是每次都会获得相同的数字。有时候我确实会得到不同的数字,但是这是同一件事,我必须多次调试才能获得新的数字。我做错了什么?
即使您使用std::random_device
,也不能保证每次获得不同的序列:
std :: Random_device可以根据一个 实施定义的伪随机编号引擎 非确定性来源(例如,硬件设备)无法使用 实施。在这种情况下,每个std :: Random_device对象可能 生成相同的数字序列。
发生的情况发生,Windows上的STDLIBC 的较旧的G 植入。
此外,由于性能问题,random_device
通常仅使用(一次)用于播种伪随机位发生器,例如Mersenne Twister Engine(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';
}
在这里实时演示。
与这些行:
#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);
}
我建议使用std :: vector而不是数组。如果您使用std :: rand函数,则可以用srand(time(NULL));
随时间播种。当然,您需要包括时间。您可以无需使用循环即可用generate(a.begin(), a.end(), rand);
填充矢量。这将为您每次都会为您提供一个新的随机数序列。
您不会将种子初始化为随机值。因此,您的随机发电机始终从相同的位置开始。
这是如何初始化种子从某个地方开始的一个示例。从本质上讲,您需要某些不一定质的来源,因此发电机会产生随机结果,时间是最常见的价值。
#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;
}