生成小范围的不同随机数?

Zie*_*ezi 1 c++ algorithm

我正在尝试生成一小段(约20个)不同/唯一的随机数.

这就是我现在拥有的:

unique_random.h:

#ifndef UNIQUE_RANDOM_H
#define UNIQUE_RANDOM_H

// generates a pseudo-random number in [min, max]
int random_number (unsigned int min, unsigned int max) {
    static bool seed_initialized = false;

    if (!seed_initialized) {
        seed_initialized = true;
        srand((unsigned int) time(NULL));
    }

    return rand() % (max - min + 1) + min; 
} 

// generates a random number different from the previously generated
int random_number_without_these (int min, int max, std::set<int>& generated) {
    int res = random_number (min, max);

    // if res one of the previous, generate again
    while (s.find(res) != s.end()) {
        res = random_number (min, max);
    }

    return res;
}

#endif
Run Code Online (Sandbox Code Playgroud)

那么上面的函数将被调用如下:

main.cpp:

#include <iostream>
#include <time.h>
#include <set>

#include "unique_random.h" 

int main() {

    std::set<int> already_generated;

    for (auto i = 0; i < 20; ++i) {

        int rand =  random_number_without_these(1,20, already_generated);
        already_generated.insert(rand);
    }

}
Run Code Online (Sandbox Code Playgroud)

其中预期的结果是已经生成了20个连续的唯一值.我现在已经写了需要两个功能random_number_without_these(),random_number() 和一个容器,set<int>为了工作,这就是为什么我想知道:

是否有更简单的方法来生成短距离的独特随机数,可能与现有代码一致?

Som*_*ude 5

使用std::set和例如std::uniform_int_distribution它实际上非常容易:

#include <iostream>
#include <set>
#include <random>

std::set<int> generate_numbers(const int min, const int max, const int count)
{
    std::set<int> numbers;
    std::random_device rd;
    std::mt19937 gen(rd());
    std::uniform_int_distribution<> dis(min, max);

    while (numbers.size() < count)
    {
        numbers.insert(dis(gen));
    }

    return numbers;
}

int main()
{
    auto numbers = generate_numbers(1, 20, 20);
    for (auto const v : numbers)
    {
        std::cout << v << ' ';
    }
    std::cout << '\n';
}
Run Code Online (Sandbox Code Playgroud)

我只是没有看到使用的意义,std::set因为这将保持所有值排序,你可以只使用一个简单的循环来生成数字,或std::iota.使用std::unordered_set我可以看到这一点.