Mặc dù đó là một chủ đề cũ, nhưng việc thêm một tùy chọn khác có thể không gây hại. (Các hàm lambda JDK 1.8 dường như làm cho nó dễ dàng);
Vấn đề có thể được chia thành các bước sau;
- Nhận giá trị tối thiểu cho danh sách các số nguyên được cung cấp (để tạo các số ngẫu nhiên duy nhất)
- Nhận giá trị lớn nhất cho danh sách các số nguyên được cung cấp
- Sử dụng lớp ThreadLocalRandom (từ JDK 1.8) để tạo các giá trị số nguyên ngẫu nhiên so với các giá trị số nguyên tối thiểu và tối đa được tìm thấy trước đó, sau đó lọc để đảm bảo rằng các giá trị thực sự được chứa trong danh sách được cung cấp ban đầu. Cuối cùng áp dụng phân biệt cho dòng nội để đảm bảo rằng các số được tạo là duy nhất.
Đây là chức năng với một số mô tả:
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;
}
Do đó, để nhận 11 số ngẫu nhiên duy nhất cho đối tượng danh sách 'allIntegers', chúng ta sẽ gọi hàm như;
List<Integer> ids = getUniqueRandomInts(allIntegers,11);
Hàm khai báo arrayList mới 'createdUniqueIds' và điền với mỗi số nguyên ngẫu nhiên duy nhất lên đến số lượng cần thiết trước khi trả về.
Lớp PS ThreadLocalRandom tránh giá trị hạt giống chung trong trường hợp các luồng đồng thời.
1..100
(có các thuật toán nổi tiếng cho điều đó), nhưng dừng lại sau khi bạn xác định cácn
phần tử đầu tiên .