在范围内生成随机数而不重复

时间:2015-12-27 04:49:43

标签: c++ arrays matrix

我使用C ++在给定范围内生成n个统一数字而不重复。我想将它保存在数组(不是vector)中。我找到了一个代码但它不允许生成数字而不重复。

std::random_device rd;     // only used once to initialise (seed) engine
std::mt19937 rng(rd());    // random-number engine used (Mersenne-Twister in this case)

std::uniform_int_distribution<int> uni(0,10-1); // guaranteed unbiased
auto random_integer = uni(rng);

例如,我将在0-9范围内生成5个随机数,例如

1 0 3 8 6

这是我的代码

typedef unsigned int U32, *PU32;
U32 total_num = 5;
U32 *rndArray = new U32[total_num];
for (U32 i = 0; i < total_num; i++)
{
    std::random_device rd  // only used once to initialise (seed) engine
    std::mt19937 rng(rd());      
    std::uniform_int_distribution<int> uni(0,10-1);
    auto random_integer = uni(rng);
    rndArray[i] = random_integer ;
}

第二种方式,我使用了下面的代码,它允许不重复。但它不支持g ++(我在ubuntu中使用g ++)

#include <random>
#include <algorithm>
#include <iterator>
#include <iostream>
typedef unsigned int U32;
int main()
{        
    U32 total_num = 5;
    U32 *rndArray = new U32[total_num];
    std::random_device rd;
    std::mt19937 g(rd());
    std::vector<int> v = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
    std::shuffle(v.begin(), v.end(), g);
    for (int i=0;i<5;i++)
    { 
        rndArray[i]=v[i];
        std::cout<< rndArray[i] << " ";
    }

    std::cout << "\n";
}

3 个答案:

答案 0 :(得分:2)

有几种方法可以做到这一点。

  1. 如果随机数已经在数组中,则生成另一个,直到找到之前未见过的数字。这很快实现,但理论上缺点是运行时间非常长。

  2. 在数组中创建整个范围,然后加扰它。要获得k个数字,请获取加扰数组的前k个元素。

答案 1 :(得分:1)

使用Fisher-Yates shuffle算法对填充了所需范围内所有数字的矢量/数组进行混洗:https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle

答案 2 :(得分:1)

实现目标的最简单方法是执行用户 Untitled123 的建议(见下文)。编译:g ++ -std = c ++ 11 file.cpp

#include <vector>
#include <algorithm>
using namespace std;

int randomize(const int &i) return rand() % i;

int main() {
    srand(unsigned(time(0)));

    int n = 10;

    vector<int> sample(n);
    // generate numbers 0 .. n-1
    iota(sample.begin(), sample.end(), 0);
    // shuffle elements
    random_shuffle(sample.begin(), sample.end(), randomize);
    // grab the first five elements after shuffling
    vector<int> chosen(sample.begin(), sample.begin() + 5);

    // do stuff

    return 0;
}