2016-10-10 3 views
0

Там у меня есть метод в java, который рандомизирует число целых чисел в массиве. Но это занимает слишком много времени, я пытаюсь найти более быстрый способ сделать это, я думаю, что алгоритм Yates Yates является решением, но я не уверен, как реализовать это с помощью моего кода.Реализация алгоритма Fisher Yates Алгоритм

protected void randomise() { 
    int[] copy = new int[getArray().length]; 
    // used to indicate if elements have been used 
    boolean[] used = new boolean[getArray().length]; 
    Arrays.fill(used,false); 
    for (int index = 0; index < getArray().length; index++) { 
     int randomIndex; 
     do { 
      randomIndex = getRandomIndex(); 
     } while (used[randomIndex]); 
     copy[index] = getArray()[randomIndex]; 
     used[randomIndex] = true; 
    } 
    for (int index = 0; index < getArray().length; index++) { 
     getArray()[index] = copy[index]; 
    } 
} 
/* 
* A method which prints out the list of nubers 
*/ 

public static void main(String[] args) { 
    RandomListing count = new SimpleRandomListing(1000000); 
    System.out.println(Arrays.toString(count.getArray())); 
} 
+0

Я видел это раньше. Это домашнее задание? – vz0

+0

Вы в конечном итоге использовали любой из ответов? Потому что, если вы это сделали, отметьте ответ, который вы использовали как правильно. – Gikkman

ответ

0
N = array.length; 
for i in [0, 1, 2, ..., N - 1]: 
    random_index = random(i, N - 1); 
    swap(array[i], array[random_index]); 
+0

Это не соответствует 'Java' как язык :-) – lospejos

+0

Да, это псевдо-что-то. Мое личное личное дело. Вопрос выглядит как домашнее задание, и для домашней работы обычно легче понять псевдокод, чем код, который вы бы назвали в качестве задания от 9 до 5. – vz0

0

Вот реализация Fisher-Yates

public static <T> void fyShuffle(T[] elem, Random rng){ 
    int index = 0; 
    T temp = null; 

    //Fisher–Yates shuffle the 'elem' array 
    for (int i = elem.length - 1; i > 0; i--) { 
     index = rng.nextInt(i + 1); 
     temp = elem[index]; 
     elem[index] = elem[i]; 
     elem[i] = temp; 
    } 
} 

Вы также можете использовать Collections.shuffle(collection) перетасовать коллекцию (например, List<>)

Смежные вопросы