2016-12-14 80 views
-1

我正在嘗試新的方法來生成隨機數並將它們填充到數組中。到目前爲止我已經完成了。C++ - 如何使用<random>來填充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); 

我以爲我設法得到的隨機數,每次我調試,但我得到了相同的編號每次。奇怪的是,有時我會得到不同的數字,但是這是我必須多次調試以獲得新數字的相同情況。我做錯了什麼?

+2

如果您想要非確定性結果,請使用'std :: random_device' – doug

+1

...並初始化例如'std :: mt19937',你在'std :: uniform_int_distribution'中使用。 – dani

+0

此外,您不需要編寫一個循環來填充「std :: array」或任何序列容器。看[std :: generate](http://en.cppreference.com/w/cpp/algorithm/generate) – PaulMcKenzie

回答

0

即使你使用std::random_device也不能保證每次都獲得不同的序列:

的std :: random_device可以在 實現定義的僞隨機數的發動機,如果條款來實現非確定性源(例如硬件設備)不可用於 的實現。在這種情況下,每個std :: random_device對象可能會生成相同的數字序列 。

發生這種情況,例如,在Windows上使用stdlibC++的舊g ++實現。

此外,由於性能問題,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

+0

謝謝你的回答!我現在更好地理解它。 –

-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; 
} 
+0

感謝您的回答! –

0

東西沿着這些路線:

#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); 
} 
+0

謝謝你的回答! :) –

0

我可以建議使用的std ::載體,而不是一個數組。如果您使用std :: rand函數,則可以使用srand(time(NULL));隨着時間排序。當然,你需要包含time.h。您可以使用generate(a.begin(), a.end(), rand);填充矢量而不使用循環。這會每次給你一個新的隨機數字序列。

+0

謝謝你的建議。我一定會牢記這一點。 std :: generate非常方便。我實際上是在試圖解決一個練習,所以這就是爲什麼我做了我對數組做的方法。儘管我注意到這可能不是最好的方法。 –

+0

你仍然可以對數組做同樣的事情,它只需要多一點代碼。然而,播種隨機數發生器是非常重要的。 –