যদিও এটি একটি পুরানো থ্রেড, তবে অন্য বিকল্প যুক্ত করা ক্ষতিগ্রস্থ হতে পারে না। (জেডিকে ১.৮ লাম্বদা ফাংশনগুলি এটিকে সহজ করে তোলে বলে মনে হয়);
সমস্যাটি নিম্নলিখিত পদক্ষেপগুলিতে বিভক্ত হতে পারে;
- পূর্ণসংখ্যার প্রদত্ত তালিকার জন্য একটি ন্যূনতম মান পান (যার জন্য অনন্য এলোমেলো সংখ্যা তৈরি করতে হবে)
- পূর্ণসংখ্যার প্রদত্ত তালিকার সর্বাধিক মান পান
- পূর্বে পাওয়া ন্যূনতম এবং সর্বাধিক পূর্ণসংখ্যার মানগুলির বিপরীতে র্যান্ডম পূর্ণসংখ্যার মান উত্পন্ন করতে থ্রেডলোক্যালর্যান্ডম ক্লাসটি (জেডিকে 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
উপাদানগুলি নির্ধারণ করার পরে থামুন ।