2015-03-08 3 views
0

Мой следующий код делает рандомизацию массива, однако, мне интересно, хочу ли я сначала объединить первые два или три элемента вместе, как мне следует продолжить?группировка первых нескольких элементов вместе

ArrayList<Integer> numbers = new ArrayList<Integer>(); 

for(int i=1;i<=11;i++) 
{ 
    numbers.add(i); 
} 
Collections.shuffle(numbers); 


for (Integer nums : numbers) 
    System.out.println(nums); 

Результат: 5, 7, 4, 11, 2, 3, 1, 9, 6, 8, 10 (Обратите внимание, что последовательность '1,2,3' рандомизированы в пределах основного массива .)

ответ

1

Что-то вроде этого, может быть:

final int[] array = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 }; 
final int iterations = 10; 
final int groupOf = 3; 

for (int i = 0; i < array.length; i += groupOf) { 
    int groupOfRemainder = array.length - i < groupOf ? array.length - i : groupOf; 
    for (int j = 0; j < iterations; j++) { 
     int rnd1 = Math.random() * groupOfRemainder; 
     int rnd2 = Math.random() * groupOfRemainder; 

     Object temp = array[i + rnd1]; 
     array[i + rnd1] = array[i + rnd2]; 
     array[i + rnd2] = temp; 
    } 
} 
+0

Ваша строка 'array [i + rnd2];' бросает ошибку 'не заявление' – John

+0

Исправлено. Пропущен «= temp;». – sturcotte06

+0

Спасибо, просто напечатайте 'System.out.println (array);' out for loop is print '[I @ 7852e922', поскольку я считаю, что печатаю значение объекта – John

1
public static void shuffleKeepingFirstRTogether(List<Integer> list, int r) { 
    int size = list.size(); 
    Collections.shuffle(list.subList(0, r)); 
    Collections.shuffle(list.subList(r, size)); 
    Collections.rotate(list, new Random().nextInt(size - r)); 
} 
+0

Я обновил свой пост с большим количеством деталей. Я хочу, чтобы первые три элемента были в случайном порядке, но всегда вместе. – John

+0

@John OK, изменение сделано. –

+1

Спасибо, этот тоже отлично работает. – John

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