2012-06-08 3 views
2

0...n에서 반복되지 않는 난수 세트를 생성하려고합니다.랜덤이지만 반복하지 않는 숫자 생성 (C++)

예 : 9,2,5,7,4,6,1,3,8,0]

나의 현재 방법은 std::set 카운트까지 while 루프에서 난수를 생성 n입니다. 분명히 이것은 큰 세트를 완성하는 데 꽤 오래 걸립니다. 이 작업을 수행하는 더 좋은 방법이 있습니까?

+11

'[1, N]'http://stackoverflow.com/questions/6926433/how-to-shuffle-a-stdvector-in :-) -c – cnicutar

+1

@cnicutar : sunofa ... 이제 나는 바보가된다 ... 당신은 절대적으로 옳습니다! :) 만약 당신이 대답을 넣어, 나는 그것을 체크! – Samaursa

+3

괜찮습니다. 왜 이렇게 멋진 C++ 관용적 인 예제로 자신의 질문에 대답하지 않습니까? – cnicutar

답변

3

순차 값을 STL 컬렉션에 배치 한 다음 random_shuffle을 사용하여 적절하게 임의로 섞을 수 있습니다.

1

숫자 목록을 셔플하고 반복하십시오.

#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

시퀀스를 생성하고 셔플, 당신이 원하는 임의의 숫자를 생성하고 이전에 발생한 것들을 폐기 그러나 그것 반드시 동일하지 수 있습니다. 당신은 만 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 

를 생성하고 그 셔플하여 원하는 분포를받지 않습니다.

원하는 숫자를 얻을 때까지 원하는 범위에서 임의의 숫자를 생성 한 다음 결과를 정렬하고 고유 한 번호를 생성하여 고유 번호에 의해 제거 된 항목을 보충 할 수 있습니다 (새 숫자가 당신이 가면서 독특한). 생성 된 숫자의 범위가 원하는 값의 수보다 훨씬 크지 않으면 시작하기 위해 몇 가지 추가 값을 생성 할 수 있습니다. 어떤 경우 든 원하는 고유 값을 얻은 마지막 단계는 정렬 된 순서가 아니도록 순서를 섞는 것입니다.

0

시도해보십시오.

당신이 순서를 셔플 할 것 나에게 보이는
#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(); 
관련 문제