0...n
에서 반복되지 않는 난수 세트를 생성하려고합니다.랜덤이지만 반복하지 않는 숫자 생성 (C++)
예 : 9,2,5,7,4,6,1,3,8,0]
나의 현재 방법은 std::set
카운트까지 while 루프에서 난수를 생성 n
입니다. 분명히 이것은 큰 세트를 완성하는 데 꽤 오래 걸립니다. 이 작업을 수행하는 더 좋은 방법이 있습니까?
0...n
에서 반복되지 않는 난수 세트를 생성하려고합니다.랜덤이지만 반복하지 않는 숫자 생성 (C++)
예 : 9,2,5,7,4,6,1,3,8,0]
나의 현재 방법은 std::set
카운트까지 while 루프에서 난수를 생성 n
입니다. 분명히 이것은 큰 세트를 완성하는 데 꽤 오래 걸립니다. 이 작업을 수행하는 더 좋은 방법이 있습니까?
순차 값을 STL 컬렉션에 배치 한 다음 random_shuffle을 사용하여 적절하게 임의로 섞을 수 있습니다.
숫자 목록을 셔플하고 반복하십시오.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
vector<int> v;
for(int i=0;i<10;i++)
v.push_back(i);
random_shuffle(v.begin(), v.end());
for(vector<int>::iterator itr=v.begin(); itr != v.end(); ++itr)
cout << *itr << endl;
}
시퀀스를 생성하고 셔플, 당신이 원하는 임의의 숫자를 생성하고 이전에 발생한 것들을 폐기 그러나 그것 반드시 동일하지 수 있습니다. 당신은 만 1 ~ 2에서 10 개 개의 고유 한 난수를 원하는 경우 예를 들어, 당신은 분명히 단지
1,000,000
1,000,001
1,000,002
1,000,003
1,000,004
1,000,005
1,000,006
1,000,007
1,000,008
1,000,009
를 생성하고 그 셔플하여 원하는 분포를받지 않습니다.
원하는 숫자를 얻을 때까지 원하는 범위에서 임의의 숫자를 생성 한 다음 결과를 정렬하고 고유 한 번호를 생성하여 고유 번호에 의해 제거 된 항목을 보충 할 수 있습니다 (새 숫자가 당신이 가면서 독특한). 생성 된 숫자의 범위가 원하는 값의 수보다 훨씬 크지 않으면 시작하기 위해 몇 가지 추가 값을 생성 할 수 있습니다. 어떤 경우 든 원하는 고유 값을 얻은 마지막 단계는 정렬 된 순서가 아니도록 순서를 섞는 것입니다.
시도해보십시오.
당신이 순서를 셔플 할 것 나에게 보이는#include <iostream>
#include <algorithm>
using namespace std;
void main()
{
int *tab;
int nr;
srand(time(0));
cout << "How many numbers do you want to generate?: ";
cin >> nr;
tab = new int[nr]; //Dynamic memory allocation
for (int i = 0;i < nr;i++)
tab[i] = i+1;
random_shuffle(&tab[0], &tab[nr]); //Shuffle the numbers from tab;
cout << "\t\tMixed numbers are: " << endl;
for (int i = 0;i < nr;i++)
cout << "Number [" << i + 1 << "]: " << tab[i]<<endl;
delete [] tab;
cin.get();
'[1, N]'http://stackoverflow.com/questions/6926433/how-to-shuffle-a-stdvector-in :-) -c – cnicutar
@cnicutar : sunofa ... 이제 나는 바보가된다 ... 당신은 절대적으로 옳습니다! :) 만약 당신이 대답을 넣어, 나는 그것을 체크! – Samaursa
괜찮습니다. 왜 이렇게 멋진 C++ 관용적 인 예제로 자신의 질문에 대답하지 않습니까? – cnicutar