如何制作随机的4x4 array<array<int,4>,4>
?此2D阵列的每个元素应该是0
到15
之间的唯一编号。
示例:
6 7 5 4
10 11 12 15
1 3 2 8
9 14 0 13
答案 0 :(得分:5)
以下是您可以遵循的一些步骤:
std::array<std::array<int, 4>, 4> myArray;
16
的临时std::vector,其中包含0
到15
的值。答案 1 :(得分:1)
这不是一个糟糕的问题。这将是我的选择:
我扩展了我的答案,仅使用std::vector
和std::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