[英]c++ - How to use <random> to fill std::array
我正在嘗試生成隨機數並將其填充到數組中的新方法。 到目前為止,我已經完成了。
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上使用較舊的g ++實現stdlibc ++時就發生了這種情況。
而且,由於性能問題,通常只(一次)使用random_device
來播種偽隨機位生成器,例如梅森扭曲器引擎( 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));
隨時間播種它srand(time(NULL));
。 當然,您需要為此添加time.h。 您可以用generate(a.begin(), a.end(), rand);
填充矢量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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.