2011-12-07 35 views
9

Ai đó có thể cho tôi biết làm thế nào tôi có thể chọn một số số ngẫu nhiên khác nhau từ một mảng cùng một lúc? Ví dụ, có một mảng dài int. Tôi muốn chọn 7 con số từ nó. Tất cả các số không được giống nhau và sắp xếp chúng theo chuỗi tăng.Java: chọn một vài số ngẫu nhiên khác nhau từ mảng trong một thời gian

Random random = new Random(); 
int a = mixColor[random.nextInt(mixColor.length)]; 
int b = mixCoor[random.nextInt(mixCoor.length)]; 
int c = mixCoor[random.nextInt(mixCoor.length)]; 
int d = mixCoor[random.nextInt(mixCoor.length)]; 
int e = mixCoor[random.nextInt(mixCoor.length)]; 
while(b!=c && c!=d && b!=d) { 
    b = mixCoor[random.nextInt(mixCoor.length)]; 
    c = mixCoor[random.nextInt(mixCoor.length)]; 
    d = mixCoor[random.nextInt(mixCoor.length)]; 
} 

mixColor[]mixCoor[] là các mảng dài. Tôi có thể làm theo cách này, nhưng nếu tôi muốn chọn nhiều con số hơn thì điều này sẽ rất phức tạp. Và tôi cũng cần sắp xếp chúng. Ai đó có ý tưởng hay?

+0

Tùy thuộc vào bộ sưu tập của bạn lớn như thế nào, bạn có thể sử dụng trộn và sau đó chọn nhiều phần tử đầu tiên theo yêu cầu. Bạn có thể muốn điểm chuẩn này - bộ sưu tập của bạn có thể đủ lớn và có thể làm chậm quá trình thu thập, sau đó hủy bỏ sự đơn giản mà bạn thoát khỏi điều này. Dưới đây là thông số cho [shuffle] (http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Collections.html#shuffle%28java.util.List%29) –

+0

Tốt hơn cách sẽ là sử dụng một số ngẫu nhiên '' và xem danh sách đã chọn đã có số ở chỉ mục được tạo ra chưa. Sau đó sắp xếp bằng cách sử dụng 'Bộ sưu tập ' – Jon

Trả lời

9

Hãy thử với phương pháp này:

public static int[] pickNRandom(int[] array, int n) { 

    List<Integer> list = new ArrayList<Integer>(array.length); 
    for (int i : array) 
     list.add(i); 
    Collections.shuffle(list); 

    int[] answer = new int[n]; 
    for (int i = 0; i < n; i++) 
     answer[i] = list.get(i); 
    Arrays.sort(answer); 

    return answer; 

} 

Sử dụng nó như thế này:

int[] mixColor = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0}; 
int[] randomPicks = pickNRandom(mixColor, 5); 

Phương pháp đảm bảo rằng exac tly n các yếu tố được chọn ngẫu nhiên và chúng sẽ được trả lại sắp xếp. Nó cũng đảm bảo rằng không có phần tử nào được chọn nhiều hơn một lần và mảng kết quả sẽ không có bản sao, miễn là mảng đầu vào không bị trùng lặp.

Mã trên hoạt động tốt, nhưng nó cồng kềnh phải chuyển qua lại giữa intInteger và có thể chậm nếu mảng đầu vào lớn (ví dụ: 100.000 phần tử). Kiểm tra nó trước, và xem nếu nó phù hợp với nhu cầu của bạn.

+0

ý tưởng là khá thú vị và nó thực sự hữu ích, cổ vũ! – nich

+0

Một cách thực sự thông minh để có được kết quả mong muốn .. công việc tốt –

1
Random gen = new Random(); 
int max = mixCoor.length; // Maximum Random value to generate 

ArrayList<Integer> picked = new ArrayList<Integer>(); // List of picked numbers 

for(int i = 0; i < numToBePicked; i++) { 
    int index = gen.nextInt(max); 
    if(!picked.contains(mixCoor[index]) // If the number isn't already picked 
    picked.add(mixCoor[index]); // Add it to the "picked" list 
} 

Collections.sort(picked); // Sort the picked numbers into ascending order 
-1
Random random new Random(); 
for (int i=0;i<7;i++){ 
int a = mixColor[random.nextInt()%mixColor.length]; 
} 

tất nhiên, bạn có thể sử dụng một hạt giống cho ngẫu nhiên và nhận được số ngẫu nhiên hơn

+2

Câu trả lời này thiếu một số điều mà OP yêu cầu: không thể lặp lại các số ngẫu nhiên và sắp xếp. Xem câu trả lời của Jon ở trên. –

0

Bạn có thể làm tất cả mọi thứ mà bạn muốn sử dụng API java hiện có:

public static Integer[] pickRandom(Integer[] array, int number) { 
    List<Integer> list = new ArrayList<Integer>(Arrays.asList(array)); 
    Collections.shuffle(list); 
    list = list.subList(0, number); 
    Collections.sort(list); 
    return list.toArray(new Integer[number]); 
} 

Ghi chú: Bạn cần có cuộc gọi này với một Integer[], chứ không phải là int[], vì vậy bạn sẽ phải chuyển đổi này chính mình. Ngoài ra, trong khi "hiệu quả" về kích thước và độ phức tạp của mã, điều này sẽ không hiệu quả về mặt hiệu năng (mặc dù nó vẫn có thể sử dụng được). Mã này sẽ đơn giản hơn nếu bạn có một số List<Integer> để bắt đầu.

Các vấn đề liên quan