随机std :: array

时间:2012-06-19 21:07:41

标签: c++ arrays random c++11

如何制作随机的4x4 array<array<int,4>,4>?此2D阵列的每个元素应该是015之间的唯一编号。

示例:

6   7  5  4
10 11  12 15
1   3  2  8
9  14  0  13

2 个答案:

答案 0 :(得分:5)

以下是您可以遵循的一些步骤:

  1. 定义您的数组:std::array<std::array<int, 4>, 4> myArray;
  2. 准备一个大小为16的临时std::vector,其中包含015的值。
  3. 随机重新排序此向量的元素,我建议您查看std::random_shuffle
  4. 使用此向量初始化数组

答案 1 :(得分:1)

这不是一个糟糕的问题。这将是我的选择:

如何生成后续数组值,混合它们并用它们初始化2D数组?

我扩展了我的答案,仅使用std::vectorstd::vector + std::array(正如O.P所要求的那样)包含另一个(简单)问题的解决方案。

  #include <vector>
  #include <array>
  #include <algorithm>
  using namespace std;

  // ...
  const int N = 4;  // we want to have 4x4 arrays for now
  // ...

  // C++ was tremendously simplified over the years in order to 
  // get a much more complicated language. This is what you can do ...

  // ...
  // First, generate a std::vector of shuffled numbers [0..15] over 16 elements
  vector<int> v;
  for(int i=0; i<N*N; i++) v.push_back(v.size()); // initialize w/index
  random_shuffle (v.begin(), v.end());            // shuffle element values

  // (Variant 1) std::array (C++11), row-wise copy of the vector data
  //  + will only work with newer (C++11 enabled) compiler versions
  array<array<int,N>,N> amat;  // there's no assign() member, so we have
  for(int i=0; i<N; i++)       // to copy each row through external template
     copy( v.begin()+i*N, v.begin()+(i+1)*N, amat[i].begin() );
  // done
  // ...

在for循环中,我们只进行了4次迭代,但总共有4x4个元素。因为4个矩阵行中的每一个都是4个元素宽,所以我们必须找到一种方法,我们如何从我们的shuffeld 16元素1D向量v中为每个矩阵行获取正确的 4个元素:{{1} }。如果v.begin()+i*N ... v.begin()+(i+1)*N为0(第一次迭代),我们会复制i中的四个元素,这意味着v[0 * N] ... v[0+1 * N]

这是一个序列,其中副本中的最后一个元素v [4] 未包括。这在某种程度上也是C / C ++中的惯用模式,与v[0] .. v[4]相当。 因此,END元素超出范围,不包括在内。

在第二次迭代(i = 1)中,我们有for(i=START; i < END; i++) ...,即v[1 * N] ... v[1+1 * N]。你看到了模式吗?

v[4] ... v[8]

为什么洗牌的订单总是一样的? C库使用随机数实现,该实现从相同的种子编号开始,始终生成相同的序列(这对于调试可能很重要)。为了获得不同的改组,您必须在程序开始一次时重新初始化随机数生成器。

  // ...
  // (Variant 2) std::vector (STL), row-wise copy of the vector data
  //  + should work with almost every c++ compiler
  vector<vector<int>> vmat(N);
  for(int i=0; i<N; i++) 
     vmat[i].assign( v.begin()+i*N,  v.begin()+(i+1)*N );
  // done
  // ...
  // TODO: now try to print all elements line 4x4 matrix

为此,您需要C库时间标头(对于 ... srand((unsigned)time(NULL)) ... )和最可能的stdlib-header(对于time()):

srand()

我故意试图提供非常简单的解决方案。因此,没有任何生成器或C ++ 11 lambdas似乎适用于此目的。

此致

RBO