// implementation:
#include <time.h>
#include <algorithm>
#include <array>
#include <numeric>
#include <random>
#include <vector>
std::array<std::array<int, 4>, 4> make_random_array()
{
typedef std::vector<int>::difference_type diff_t;
std::array<std::array<int, 4>, 4> ret;
std::vector<int> v(16);
std::iota(v.begin(), v.end(), 0);
std::mt19937 prng(static_cast<std::mt19937::result_type>(time(0)));
auto shuffler = [&prng](diff_t const n)
{
return std::uniform_int_distribution<diff_t>(0, n + 1)(prng);
};
std::random_shuffle(v.begin(), v.end(), shuffler);
for (decltype(v.size()) i = 0, i_end = v.size(); i != i_end; ++i)
ret[i / 4][i % 4] = v[i];
return ret;
}
//example usage:
#include <iomanip>
#include <iostream>
int main()
{
auto const arr = make_random_array();
std::for_each(
arr.cbegin(), arr.cend(), [](std::array<int, 4> const& o)
{
std::for_each(
o.cbegin(), o.cend(), [](int const i)
{
std::cout << std::setw(2) << i << ' ';
}
);
std::cout << '\n';
}
);
}
Ly8gaW1wbGVtZW50YXRpb246CiNpbmNsdWRlIDx0aW1lLmg+CiNpbmNsdWRlIDxhbGdvcml0aG0+CiNpbmNsdWRlIDxhcnJheT4KI2luY2x1ZGUgPG51bWVyaWM+CiNpbmNsdWRlIDxyYW5kb20+CiNpbmNsdWRlIDx2ZWN0b3I+CgpzdGQ6OmFycmF5PHN0ZDo6YXJyYXk8aW50LCA0PiwgND4gbWFrZV9yYW5kb21fYXJyYXkoKQp7CiAgICB0eXBlZGVmIHN0ZDo6dmVjdG9yPGludD46OmRpZmZlcmVuY2VfdHlwZSBkaWZmX3Q7CgogICAgc3RkOjphcnJheTxzdGQ6OmFycmF5PGludCwgND4sIDQ+IHJldDsKICAgIHN0ZDo6dmVjdG9yPGludD4gdigxNik7CiAgICBzdGQ6OmlvdGEodi5iZWdpbigpLCB2LmVuZCgpLCAwKTsKICAgIHN0ZDo6bXQxOTkzNyBwcm5nKHN0YXRpY19jYXN0PHN0ZDo6bXQxOTkzNzo6cmVzdWx0X3R5cGU+KHRpbWUoMCkpKTsKICAgIGF1dG8gc2h1ZmZsZXIgPSBbJnBybmddKGRpZmZfdCBjb25zdCBuKQogICAgewogICAgICAgIHJldHVybiBzdGQ6OnVuaWZvcm1faW50X2Rpc3RyaWJ1dGlvbjxkaWZmX3Q+KDAsIG4gKyAxKShwcm5nKTsKICAgIH07CiAgICBzdGQ6OnJhbmRvbV9zaHVmZmxlKHYuYmVnaW4oKSwgdi5lbmQoKSwgc2h1ZmZsZXIpOwogICAgZm9yIChkZWNsdHlwZSh2LnNpemUoKSkgaSA9IDAsIGlfZW5kID0gdi5zaXplKCk7IGkgIT0gaV9lbmQ7ICsraSkKICAgICAgICByZXRbaSAvIDRdW2kgJSA0XSA9IHZbaV07CiAgICByZXR1cm4gcmV0Owp9CgovL2V4YW1wbGUgdXNhZ2U6CiNpbmNsdWRlIDxpb21hbmlwPgojaW5jbHVkZSA8aW9zdHJlYW0+CgppbnQgbWFpbigpCnsKICAgIGF1dG8gY29uc3QgYXJyID0gbWFrZV9yYW5kb21fYXJyYXkoKTsKICAgIHN0ZDo6Zm9yX2VhY2goCiAgICAgICAgYXJyLmNiZWdpbigpLCBhcnIuY2VuZCgpLCBbXShzdGQ6OmFycmF5PGludCwgND4gY29uc3QmIG8pCiAgICAgICAgewogICAgICAgICAgICBzdGQ6OmZvcl9lYWNoKAogICAgICAgICAgICAgICAgby5jYmVnaW4oKSwgby5jZW5kKCksIFtdKGludCBjb25zdCBpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHN0ZDo6Y291dCA8PCBzdGQ6OnNldHcoMikgPDwgaSA8PCAnICc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAnXG4nOwogICAgICAgIH0KICAgICk7Cn0=