2013-01-11 1 views
3

Если есть для цикла, какМогу ли я повторять цикл for случайно, а не последовательно?

for (int i = 0; i <= 10; i++) 
{ 
    //block of code 
} 

То, что я хочу добиться того, после первой итерации я ценю не нужно быть 1, это может быть что угодно, от 1 до 10, я не должен быть 0 снова и аналогично для других итераций.

+0

Только C# и Java? –

ответ

7

Простой алгоритм:

  • создать массив, содержащий числа от 0 до 10
  • перетасовать
  • перебрать этот массив и получить соответствующий индекс в исходной коллекции

В Java :

public static void main(String[] args) throws Exception { 
    List<Integer> random = Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10); 
    Collections.shuffle(random); 

    List<String> someList = Arrays.asList("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k"); 

    for (int i : random) { 
     System.out.print(someList.get(i)); 
    } 
} 

выходы:

ihfejkcadbg

EDIT

Теперь, когда я перечитываю его, вы можете также просто перетасовать первоначальный сбор и цикл:

public static void main(String[] args) throws Exception { 
    List<String> someList = Arrays.asList("a", "b", "c", "d", "e", "f", "g", "h", "i", "j"); 

    //make a copy if you want the initial collection intact 
    List<String> random = new ArrayList<> (someList); 
    Collections.shuffle(random); 

    for (String s : random) { 
     System.out.print(s); 
    } 
} 
6

Да, вы можете сделать это: во-первых, создать random permutation номеров 0 .. N-1, а затем итерацию, как это:

int[] randomPerm = ... // One simple way is to use Fisher-Yates shuffle 
for (int i in randomPerm) { 
    ... 
} 

Link to Fisher-Yates shuffle.

+0

+1 для ссылки. –

2

«перетасовка» подход, вероятно, самый простой, но потянув их в случайном порядке может работать тоже; основная проблема заключается в том, что RemoveAt относительно дорого. Перетасовка будет дешевле. Включено для полноты:

var list = new List<int>(Enumerable.Range(0, 10)); 
var rand = new Random(); 
while (list.Count > 0) { 
    int idx = rand.Next(list.Count); 
    Console.WriteLine(list[idx]); 
    list.RemoveAt(idx); 
} 
+0

Спасибо за ответ. –

+0

этот ответ на вопрос, если он равен 0-10, что, если начальное семя Enumerable начинается с ненулевого числа, например, как этот Enumerabl.Range (5,10) – Sankara

+0

@ 101010, вы добавили бы смещение примерно в 2 строки кода; не biggie –

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

  • Нет связанных вопросов^_^