yumetodo氏がC++11規格の重複しない乱数配列の生成法を書いていたので、C++14規格のものを作ってみました。
#include <random>
#include <vector>
#include <iostream>
auto random() {
std::random_device rnd; // 非決定的な乱数生成器を生成
return std::mt19937 (rnd()); // メルセンヌ・ツイスタの32ビット版、引数は初期シード値
}
auto make_rand_arr(const size_t size, int rand_min, int rand_max) {
std::vector<int> re(size);
std::uniform_int_distribution<int> rand(rand_min, rand_max);
auto mt = random();
for (auto& i : re) {
i = rand(mt);
}
bool is_all_no_conflict = false;
do {
is_all_no_conflict = true;
for (auto j = re.begin(); j != re.end(); ++j) {
for (auto k = j + 1; k != re.end(); ++k) {
if (*k == *j) {
*k = rand(mt);
is_all_no_conflict = false;
}
}
}
} while (!is_all_no_conflict);
return re;
}
使用例
int main() {
const auto arr = make_rand_arr(12, 1, 1000);
for (auto i : arr) std::cout << i << ", ";
std::cout << std::endl;
return 0;
}