簡體   English   中英

C ++-如何使用 <random> 填充std :: array

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM