如何使用<random>填充标准::数组

How to use <random> to fill std::array

本文关键字:标准 数组 填充 random 何使用 lt gt      更新时间:2023-10-16

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

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