2014-01-24 2 views
0

Так что я немного застрял на этом. Я пытался и искал часы, и мне еще предстоит найти решение, которое соответствует моим профессорам очень строгим параметрам.Заполните массив случайной перестановкой

Мне нужно заполнить массив случайной перестановкой чисел от 0 до 9, и они не могут повторяться. Я знаю, что в этом есть много тем, и я нашел несколько способов сделать это, но это не соответствует нашим требованиям.

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

for(int i=1; i<numItems; i++) 
    { 
     int count = 1; 
     int m=rand.nextInt(numItems); 
     for(int j=0; j<i; j++) 
     { 
      if(m==permutation[j]) 
      { 
       m=rand.nextInt(numItems); 
       count++; 
       j=-1; 
      } 
     } 
     permutation[i]=m; 
     numAttempts[i]=count;  
    } 

И это прекрасно работает, но мы не можем изменить переменную управления (J) внутри цикла.

В основном я хочу, чтобы он начинал тестирование с самого начала со случайными числами, которые генерирует объект rand в любое время, если утверждение истинно.

Любая помощь очень ценится.

EDIT: Его выход enter image description here

+1

Простейшим решением является заполнение массива уникальными значениями (легко), а затем справедливое перемешение его содержимого. Это позволяет избежать того, чтобы отслеживать, какие значения были/еще не были замечены, поскольку он начинает уникальным и, по-видимому, все еще уникален после каждого шага в случайном порядке. – keshlam

+0

Я не могу перетасовать их. Он должен быть последовательным выходом, и он должен выглядеть точно так же, как и его, который не использует shuffle. – user3092589

+0

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

ответ

0

Так, глядя на требуемой мощности, ваш алгоритм должен быть:

Для каждого числа я, выбрать случайные числа, пока вы не получите тот, который вы уже не забрать. Затем поместите это число в массив и запишите, сколько номеров вам нужно было выбрать, прежде чем вы получите новый.

Таким образом, рефакторинга ваш код немного, чтобы использовать цикл вместо сброса j до -1:

for(int i=1; i<numItems; i++) 
{ 
    int count = 0; 
    bool found = false; 
    do { 
     int m=rand.nextInt(numItems); 
     count++; 
     for(int j=0; j<i; j++) 
     { 
      if(m==permutation[j]) 
      {     
       found = true; 
       break; 
      } 
     } 
    } while (found); 
    permutation[i]=m; 
    numAttempts[i]=count;  
} 

(Мой Java является ржавый, что синтаксис может быть неправильно, но я надеюсь, что вы получите идея)

+0

Это именно то, что я искал, я думаю! Цикл do-while, я не мог обмотать голову вокруг него раньше. – user3092589

+0

Я думаю, что вы имели в виду 'while (! Found)'. Кроме этого ... да, это, кажется, то, о чем он просил. Я все еще говорю, что это ужасное решение для указанной проблемы, но если цель состоит в том, чтобы продемонстрировать, что по мере заполнения таблицы становится все труднее найти значение, которое еще не было использовано (возможно, чтобы проиллюстрировать статистику и показать, почему это * - это ужасное решение), он это делает. – keshlam

+0

@keshlam никаких аргументов от меня! Но профессор имеет очень неортодоксальный подход. – user3092589

0

кажется, что алгоритм, используемый в примере:

1. Draw number from PRNG 
2. Scan every previous entry in array to check if value is present 
3. If yes, go to 1 
4. Assign number to this entry 
5. Proceed to next entry 
6. Go to 1 

numAttempts, как представляется, число повторно рисует, что должно было быть сделано для каждой записи. Вы можете оптимизировать его реализацию по существу, не нарисовав последнюю запись случайным образом, а вместо этого просто используя тот факт, что после присвоения n-1 записей есть только одна возможность для n-го.

+0

Я не могу перетасовать, проверьте его вывод. – user3092589

+0

@ user3092589 Пожалуйста, перепишите свой вопрос, чтобы четко указать все требования. – Superbest

+0

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

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