特定の範囲(0〜5,000,000)が与えられており、この範囲から2,500,000個の一意の乱数を生成する必要があるとします。これを行うための効率的な方法は何ですか?真の乱数を取得するのは難しいことを理解しています。
新しい乱数を生成できるように、番号が存在するかどうかを確認してみました。ただし、計算には数時間かかります。これを行うためのより良い方法はありますか?
この背後にある理由は、私がサイズ5,000,000のベクトルを持っているからです。ベクトルを正確に半分に縮小したいと思います。つまり、ベクトルから要素のランダムな50%を削除します。
#include <iostream>
#include <vector>
#include <stdlib.h>
#include <algorithm>
using namespace std;
#define NUMBER 2500000
#define RAND_START 0
#define RAND_END 5000000
unsigned int generate_random_number(int min, int max)
{
return min + (rand() % (unsigned int)(max - min + 1));
}
int main(int argc, char* argv[])
{
unsigned int count = 0, random_number;
vector<unsigned int> rand_vector;
do
{
count++;
random_number = generate_random_number(RAND_START,RAND_END);
// Tried to manually add a different number each time. But still not a considerable improvement in performance.
if (std::find(rand_vector.begin(), rand_vector.end(), random_number) != rand_vector.end())
{
if(random_number > count)
random_number = random_number - count;
else
random_number = random_number + count;
}
rand_vector.push_back(random_number);
sort(rand_vector.begin(), rand_vector.end());
rand_vector.erase(unique (rand_vector.begin(), rand_vector.end()), rand_vector.end());
}while (rand_vector.size() != NUMBER);
for (unsigned int i =0; i < rand_vector.size(); i++)
{
cout<<rand_vector.at(i)<<", ";
}
cout<<endl;
return 0;
}
私がこれを行うことができるより良いアプローチはありますか?