2012-07-03 15 views
5

में यादृच्छिक संख्या मैं [, 0 10] रेंज में यादृच्छिक संख्या उत्पन्न करने की आवश्यकता है ऐसी है कि:उत्पन्न "इन-रेंज 'सी

  • सभी संख्या एक बार होते हैं।
  • कोई बार-बार परिणाम प्राप्त नहीं किए जाते हैं।

क्या कोई मुझे किस एल्गोरिदम का उपयोग करने के लिए मार्गदर्शन कर सकता है?

+7

एक [0, 10) अनुक्रम जनरेट करें और इसे शफ़ल। – cnicutar

+3

सबसे पहले, [आपने क्या प्रयास किया है?] (Http://whathaveyoutried.com) दूसरा, यह 0-10 या 1-10 है? –

+0

हाय कार्ल, मैंने अनुक्रम को रैंड() फ़ंक्शन के साथ उत्पन्न करने का प्रयास किया है, लेकिन परिणाम प्राप्त नहीं कर सका। दूसरा, ऊपर वर्णित रेंज 0 से 10 है। धन्यवाद –

उत्तर

1

छद्म यादृच्छिक संख्या के लिए इस एल्गोरिथ्म बाहर का प्रयास करें:

int values[11] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; 
srand(time(NULL)); 

for (int i = 0; i < 11; i++) 
{ 
    int swap1idx = rand() % 11; 
    int swap2idx = rand() % 11; 

    int tmp = values[swap1idx]; 
    values[swap1idx] = values[swap2idx]; 
    values[swap2idx] = tmp; 
} 

// now you can iterate through the shuffled values array. 

ध्यान दें कि यह एक सापेक्ष पूर्वाग्रह के अधीन है, लेकिन यह है कि तुम क्या जरूरत के लिए काम करना चाहिए।

+0

@ स्लैशमाइस ओपी स्पष्ट नहीं था, लेकिन तय है, वैसे भी। –

11

रिचर्ड जे रॉस के उत्तर में एल्गोरिदम गलत है। यह n! के बजाय n^n संभावित आदेश उत्पन्न करता है। जेफ एटवुड के ब्लॉग पर इस पोस्ट में समस्या दिखाता है: http://www.codinghorror.com/blog/2007/12/the-danger-of-naivete.html

इसके बजाय, आप नुथ-फिशर-येट्स घसीटना उपयोग करना चाहिए:

int values[11] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; 
srand(time(NULL)); 

for (int i = 10; i > 0; i--) 
{ 
    int n = rand() % (i + 1); 

    int temp = values[n]; 
    values[n] = values[i]; 
    values[i] = temp; 
} 
+1

क्या यह Knuth- या फिशर-येट्स-शफल है [http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle]? यह यहां भी है: http://stackoverflow.com/questions/1150646/card-shuffling-in-c-sharp – slashmais

+0

वही एल्गोरिदम, लेकिन मैंने नाम को सही किया। – japreiss

+0

विकिपीडिया-पेज पर यह उर्फ ​​नूथ-शफल है - मुझे परिचय पढ़ना चाहिए था, न केवल विवरण के लिए स्किम किया गया;) – slashmais

0

कोशिश इस तरह, एक अनियमित समारोह बनाने के लिए:

void randomize(int v[], int size, int r_max) { 
    int i,j,flag; 

    v[0] = 0 + rand() % r_max; // start + rand() % end 
    /* the following cycle manages, discarding it, 
the case in which a number who has previously been extracted, is re-extracted. */ 
    for(i = 1; i < size; i++) { 
     do { 
      v[i]= 0 + rand() % r_max; 
      for(j=0; j<i; j++) { 
       if(v[j] == v[i]) { 
        flag=1; 
        break; 
       } 
       flag=0; 
      } 
     } while(flag == 1); 
    } 
} 

randomize(v, 11, 11); 
:

फिर, बस इसे एक सरणी से गुजर रहा 11 की v[] तत्वों, इसके आकार, और ऊपरी सीमा फोन

सरणी, इस तथ्य के कारण कि संदर्भ द्वारा तर्क के रूप में पारित किया गया है, यादृच्छिक हो जाएगा, बिना दोहराए और संख्याएं एक बार होती हैं।

randomize कॉल करने से पहले srand(time(0)); कॉल करने के लिए याद रखें, और प्रारंभ करने में int v[11]={0,1,2,3,4,5,6,7,8,9,10};

संबंधित मुद्दे