LoginSignup
8
9

More than 5 years have passed since last update.

重複しない乱数配列(C++14版)

Last updated at Posted at 2015-09-26

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;
}
8
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
9