हालांकि यह एक पुराना धागा है, लेकिन दूसरा विकल्प जोड़ने से नुकसान नहीं हो सकता है। (JDK 1.8 लंबो कार्यों को आसान बनाने के लिए लगता है);
समस्या को निम्न चरणों में तोड़ा जा सकता है;
- पूर्णांक की प्रदान की गई सूची के लिए एक न्यूनतम मूल्य प्राप्त करें (जिसके लिए अद्वितीय यादृच्छिक संख्या उत्पन्न करें)
- पूर्णांकों की प्रदान की गई सूची के लिए अधिकतम मूल्य प्राप्त करें
- पहले पाए गए न्यूनतम और अधिकतम पूर्णांक मानों के विरुद्ध यादृच्छिक पूर्णांक मान उत्पन्न करने के लिए थ्रेडलोकल्रैंडगैम क्लास (JDK 1.8 से) का उपयोग करें और फिर यह सुनिश्चित करने के लिए फ़िल्टर करें कि मान वास्तव में मूल रूप से प्रदान की गई सूची द्वारा निहित हैं। अंत में, यह सुनिश्चित करने के लिए कि विशिष्ट संख्याएँ विशिष्ट हैं, इन्ट्रोस्ट्रीम पर लागू होते हैं।
यहाँ कुछ विवरण के साथ समारोह है:
private List<Integer> getUniqueRandomInts(List<Integer> idList, Integer numberToGenerate) {
List<Integer> generatedUniqueIds = new ArrayList<>();
Integer minId = idList.stream().mapToInt (v->v).min().orElseThrow(NoSuchElementException::new);
Integer maxId = idList.stream().mapToInt (v->v).max().orElseThrow(NoSuchElementException::new);
ThreadLocalRandom.current().ints(minId,maxId)
.filter(e->idList.contains(e))
.distinct()
.limit(numberToGenerate)
.forEach(generatedUniqueIds:: add);
return generatedUniqueIds;
}
ताकि, 'allIntegers' सूची ऑब्जेक्ट के लिए 11 अद्वितीय यादृच्छिक संख्या प्राप्त कर सकें, हम फ़ंक्शन को कॉल करेंगे;
List<Integer> ids = getUniqueRandomInts(allIntegers,11);
फ़ंक्शन नई सरणीवादी 'जनरलाइक्स' की घोषणा करता है और लौटने से पहले आवश्यक संख्या तक प्रत्येक अद्वितीय यादृच्छिक पूर्णांक के साथ पॉप्युलेट करता है।
पीएस थ्रेडलोकलेंगलर क्लास समवर्ती धागे के मामले में सामान्य बीज मूल्य से बचता है।
1..100
(इसके लिए प्रसिद्ध एल्गोरिदम हैं), लेकिन पहलेn
तत्वों को निर्धारित करने के बाद रुकें।