2012-02-24 33 views
6

Tôi muốn tạo 10 số ngẫu nhiên trong khoảng 0-500. Nhưng vấn đề là tôi muốn những con số đó là duy nhất. Đối với 2 số ngẫu nhiên, tôi có thể tạo một cái gì đó như sau:Tạo tập hợp các số ngẫu nhiên duy nhất trong Java

int randomItem1 = r.nextInt(500); 
int randomItem2 = r.nextInt(500); 
while(randomItem1==randomItem2){ 
    randomItem1=randomItem(); 
    randomItem2=randomItem(); 
} 

Nhưng nếu tôi làm điều này cho 10, tôi nghĩ rằng trong khi nó sẽ ngăn xếp. Và tôi đang nói điều này bởi vì tôi đang cố gắng tạo ra một thuật toán khổng lồ đang cố gắng thực hiện các đánh giá liên tục và tôi muốn liên tục lấy 10 số ngẫu nhiên và duy nhất. Tôi không biết phải làm gì. Bất kỳ ý tưởng hoặc đề xuất nào?

+1

Hãy thử google tìm kiếm nó lần đầu tiên http://www.wikihow.com/Generate-N-Different-Random-Numbers –

+1

Nhưng đó là một trang web khủng khiếp và câu trả lời có là sai. – BCoates

+0

@MichaelT Doubt it. Một trong những khác muốn * một * số trong phạm vi, trong khi điều này muốn * nhiều * số trong phạm vi. –

Trả lời

3

Thực hiện một LinkedList của số 1-500 và shuffle một trong số họ mỗi khi bạn sử dụng một số sử dụng The Fisher-Yates shuffle.

Điều này sẽ cho bạn đảm bảo hiệu suất sane (liên tục) cho mỗi số được kéo.

17

Có vẻ như bạn đang lưu trữ các biến này trong các biến riêng lẻ. Vị trí "bình thường" để lưu trữ các nhóm mục như thế này thường sẽ nằm trong danh sách hoặc mảng.

Trong trường hợp này, lưu trữ chúng trong cấu trúc dữ liệu "được đặt" thay thế. Nó sẽ không cho phép trùng lặp.

Set tài liệu: http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Set.html

Set set = new HashSet(); 

while (set.size() < 10) { 
    set.add(r.nextInt(500)); 
} 
+2

đây là một giải pháp gọn gàng, cộng với một – davogotland

-1

Tôi sẽ sử dụng một mảng và lưu trữ các số khi chúng được tạo vào mảng đó. Bạn sẽ tạo ra một ngẫu nhiên mới, sau đó cần phải lặp qua mảng của bạn lên đến số lượng của bạn, kiểm tra để xem nếu nó phù hợp với bất kỳ bạn đã tạo ra trước đó.

+0

Điều đó sẽ là một thiết kế khủng khiếp. CPU không xác định cần. Các câu trả lời trước đó là quan trọng hơn nhiều: tạo một tập hợp các số đủ điều kiện, "trộn chúng" và sau đó chỉ cần lặp lại danh sách ngẫu nhiên. – RichieHH

+0

Đối với giải pháp này, tôi cảm thấy vấn đề chính là viết nhiều mã hơn và không sử dụng các cấu trúc dữ liệu sẵn có. Bởi vì bạn sẽ không sử dụng cấu trúc dữ liệu sẵn có như tập hợp, bạn sẽ dành nhiều thời gian hơn để viết và gỡ lỗi mã. Tùy thuộc vào ứng dụng của bạn, tôi không chắc chắn tôi sẽ lo lắng rất nhiều về nhu cầu CPU xem xét OP chỉ cần 10 số ngẫu nhiên. Tuy nhiên, rất nhiều cấu trúc dữ liệu sẵn có "thiết lập" cũng sẽ được thiết kế sử dụng một cái gì đó hiệu quả hơn mà thuật toán O (n^2) mà bạn đề xuất ở trên. –

4

Bộ sưu tập Java có phương thức trộn. Bạn có thể đặt số của bạn vào một ArrayList và sau đó trộn nội dung của nó. Nếu ArrayList chứa n số, gọi phương thức shuffle, sẽ cung cấp cho bạn cùng một ArrayList chứa số n nhưng được sắp xếp ngẫu nhiên.

for(int i=0;i<10;i++){ 
list.add(i); // list contains: [0,1,2,3,4,5,6,7,8,9] 
} 
Collections.shuffle(list);// list now contains: [0, 9, 3, 1, 5, 8, 7, 2, 6, 4] 
Các vấn đề liên quan