2012-07-13 2 views
0

Я пытаюсь случайным образом перетасовать список. Каждый раз, когда я пытаюсь проверить код, он практически ничего не делает и не заканчивается. Мне было интересно, что именно мне не хватает или что-то не так.Случайный перетасовка Java

public static ListElement shuffle(ListElement head){ 
    int n= ListUtils.getLength(head); 
    ListElement head2= null; 
    while(head != null) { 
     int random = (int) Math.random() * n; 
     for(int i=0;i<random;i++){ 
      ListElement list= new ListElement(); 
      list=getItem(head2,n); 
      list.getNext(); 
      head2=list; 

     } 
    } 
    return head2;  
} 

GetItem

public static ListElement getItem(ListElement head, int n){ 
    if(n == 0){     
     return head;    
    }else if(head == null){  
     return null; 
    }else{      
     return getItem(head.getNext(),n-1); 
    } 
} 
+11

Просто используйте 'java.util.Collections.shuffle (MyList)' –

+0

Где код для 'GetItem()'? –

+0

Мне нужно использовать Math.random(), так как я хочу научиться его использовать. – user1513323

ответ

1

опечатка! Вы никогда не обновляете head, который вы используете в своем состоянии цикла.

+0

Я не уверен, как бы обновить голову в конце. :( – user1513323

+0

И я тоже. Я не думаю, что ваш алгоритм имеет слишком большой смысл. Но причина, по которой цикл не заканчивается, заключается в том, что 'head' никогда не будет' null', потому что вы никогда его не обновляете. всегда быть тем, что вы передаете в качестве аргумента для «shuffle». – Jochen

1

Не уверен, что метод getItem делает в цикле for.

Альтернативное решение, если вы хотите использовать Math.random(), состоит в том, чтобы пройти через весь список и создать случайный индекс для каждого элемента, который он поменяет в списке.

public void randomize(List<String> myList){ 
    int n= myList.size(); 
    for(int i; i < n; i++){ 
    int randIdx = (int) Math.random() * n; 
    swap(myList, i, randIdx); 
    } 
} 

private void swap(List<String> list, int idx1, int idx2){ 
    if(idx1 != idx2){ //don't do swap if the indexes to swap between are the same - skip it. 
    String tmp = list.get(idx1); 
    list.set(idx1, list.get(idx2)); 
    list.set(idx2, tmp); 
    } 
} 
Смежные вопросы