我使用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";
}
答案 0 :(得分: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;
}