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

时间:2016-12-14 21:59:52

标签: c++ c++11

我正在尝试新的方法来生成随机数并将它们填入数组中。到目前为止,我已经完成了。

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);

我以为每次调试时我都设法得到随机数,但我每次都得到相同的数字。奇怪的是,有时我会得到不同的数字,但那时我必须多次调试以获得新的数字。我做错了什么?

4 个答案:

答案 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;
}