यादृच्छिक रूप से c ++ में n तक अद्वितीय संख्याएं उत्पन्न करें

मैंने एक लूप में रैंड() फ़ंक्शन को कॉल करने का प्रयास किया है जो एन बार पुनरावृत्त करता है, लेकिन उत्पन्न संख्याएं अद्वितीय नहीं हैं। इसलिए 0 से एन तक एन यादृच्छिक संख्या उत्पन्न करने के लिए कृपया कोई फ़ंक्शन या तर्क सुझाएं।

0
std :: iota और std :: shuffle का उपयोग करें। जब तक मैं आपके "अद्वितीय" को गलत समझ नहीं पा रहा हूं। फिर यह सिर्फ std :: उत्पन्न है।
जोड़ा लेखक chris, स्रोत
यादृच्छिक संख्या अद्वितीय होनी चाहिए, या इसके बजाय, कॉल-टू-कॉल बदलें। यदि आपके लूप में srand पर कॉल भी शामिल है, तो यह आपकी समस्या है। आपको अपने कार्यक्रम की शुरुआत में केवल srand को कॉल करना चाहिए।
जोड़ा लेखक Joe Z, स्रोत
साथ ही, यदि आप सी ++ 11 का उपयोग कर सकते हैं तो आपको सी ++ 11 यादृच्छिक संख्या इंजन/वितरण में देखना चाहिए। मैंने इस उत्तर में एक सिंहावलोकन दिया: stackoverflow.com/questions/20309009/…
जोड़ा लेखक Joe Z, स्रोत
जो जेड की टिप्पणी को स्पष्ट करने के लिए, अधिकांश रैंड() कार्यान्वयन में 2 ^ 32 की अवधि होती है जिसका अर्थ यह है कि जब तक आप srand() को दोबारा कॉल नहीं करते हैं तब तक परिणाम लगभग 4 बिलियन कॉल तक नहीं दोहराए जाते हैं। उस ने कहा, यदि आप 0 और एन -1 के बीच एक संख्या प्राप्त करने के लिए % n का उपयोग कर रहे हैं तो n << 2 ^ 32 के लिए वे मान किसी भी समय दोहरा सकते हैं। यह उस तरह से काम करने के लिए है। यदि आप यादृच्छिक क्रम में 0 से एन -1 की संख्या चाहते हैं, तो क्रिस की सलाह का पालन करें - अनुक्रम को वेक्टर में रखें, फिर std :: shuffle का उपयोग करें - यह कार्ड के डेक को घुमाने जैसा है।
जोड़ा लेखक Tony Delroy, स्रोत
यदि आप [0, n) से यादृच्छिक संख्या n उत्पन्न करने का प्रयास कर रहे हैं, तो संख्याओं का आपका सेट 0 से n तक प्रत्येक नंबर होगा ... वहां है यादृच्छिक संख्या जनरेटर के लिए बिल्कुल कोई ज़रूरत नहीं है।
जोड़ा लेखक Zac Howland, स्रोत
@ZacHowland, मैंने सिर्फ छः तरफा मरने के लिए छः बार घुमाया। मुझे {2, 3, 3, 4, 6, 1} मिला। कोई पांच नहीं मुझे लगता है कि आप कहने के लिए "अगर आप n अद्वितीय [0, n) से यादृच्छिक संख्याएं उत्पन्न करने का प्रयास कर रहे हैं, तो संख्याओं का आपका सेट 0 से एन तक प्रत्येक नंबर होने जा रहा है "।
जोड़ा लेखक chwarr, स्रोत
@ user3053803, क्या आप स्पष्ट कर सकते हैं कि "उत्पन्न संख्याएं अद्वितीय नहीं हैं" और आप उन्हें अद्वितीय क्यों होने की उम्मीद करते हैं? आप इन यादृच्छिक संख्याओं का उपयोग करने की योजना कैसे बना रहे हैं? क्या आप अनुक्रम [0, एन) में संख्या चाहते हैं लेकिन एक यादृच्छिक क्रम में, शायद?
जोड़ा लेखक chwarr, स्रोत

2 उत्तर

यह आपके अद्वितीय संख्या संयोजन की संभावना वितरण पर अत्यधिक निर्भर करता है जिसे आपको प्राप्त करने की आवश्यकता है।

सबसे सरल (लेकिन धीमी) दृष्टिकोण केवल यादृच्छिक संख्या उत्पन्न करेगा, क्लोन छोड़कर, जब तक आप गर्म n संख्याएं न हों। इस मामले में आपके पास अद्वितीय एन-संख्या संयोजन के लिए समान संभाव्यता वितरण होगा।

0
जोड़ा

यदि आपको मूल्यों [0, एन) (यानी 0, 1, 2, ... एन -1) के यादृच्छिक शफल का उत्पादन करने की आवश्यकता है, तो निम्न कोड (cppreference.com से अनुकूलित) चाल करेगा:

#include 
#include 
#include 

vector shuffled_vector( int n )
{
    std::vector v(n);
    std::iota(v.begin(), v.end(), 0);

    std::random_shuffle(v.begin(), v.end());

    return v;
}

The original example on cppreference was a bit more involved. Find it here: http://en.cppreference.com/w/cpp/algorithm/iota

यदि आपके पास कोई विशेष आवश्यकता है तो आप std :: random_shuffle पर एक यादृच्छिक संख्या जनरेटर प्रदान कर सकते हैं। v.end() के बाद यह तीसरा तर्क है। यहां अधिक जानकारी: http://en.cppreference.com/w/cpp/algorithm/random_shuffle

0
जोड़ा