Как поменять местами положение каждого из моих четырех элементов пользовательского интерфейса случайным образом?- алгоритм на 24 возможности - PullRequest
3 голосов
/ 06 марта 2010

У меня есть программа с четырьмя разными кнопками. Я хочу поменять местами кнопки случайным образом. Например: 1 2 3 4 Позже: 3 4 1 2 Позже: 1 3 2 4

Есть ли алгоритмы для этого? Единственный способ, которым я могу думать, - это сделать случайное число от 1 до 24 (24 варианта) и затем кодировать все возможные посты кнопок.

     int foo = arcrandom() % 23;
      switch(foo){
       case 0:
        button1postiton = 100; //just an example
        button2position = 200;
        button3position = 300;
        button4position = 400;
        break;
       case 2:
        button1postiton = 200;
        //blablabla and so on and so on
}

Но есть ли более эффективный способ?

Спасибо!

Ответы [ 4 ]

5 голосов
/ 06 марта 2010

Вы можете перетасовать кнопки или их позиции, например, с помощью шаффла Фишера-Йейтса.

1 голос
/ 06 марта 2010

Начните со случайного числа 0 <= r <24 </p>

Начните с первой позиции. Производные rr = r% 4 и r = r / 4. Это остаток и частное соответственно после деления на 4.

Остаток определяет позицию. Поменяйте положение 0 с указанной позиции.

Для следующей позиции выведите rr = r% 3 и r = r / 3. Снова остаток указывает позицию, на этот раз 0, 1 или 2, но относительно вашей текущей позиции (1).

Поменять позицию 1 на позицию rr + 1.

Для следующей позиции выведите rr = r% 2 и r = r / 2. И снова остаток указывает позицию, на этот раз 0 или 1, и снова относительно вашей текущей позиции (2).

Поменять позицию 2 на позицию rr + 2.

Для позиции 3 делать нечего.

Примечание. Для каждого свопа одна возможность - поменяться позицией с самим собой. Очевидно, что для этого не требуется обмен.

Вероятно, это случай с Фишером-Йейтсом - я понятия не имел, что у него есть имя до сегодняшнего дня.

1 голос
/ 06 марта 2010

На этом веб-сайте есть код для получения списка всех перестановок массива (см. Метод perm2), он закодирован для массивов символов, но может быть изменен для работы с массивами int, а также с другими языками, затем Вы можете использовать идею MJV.

http://www.cs.princeton.edu/introcs/23recursion/Permutations.java.html

Если в Java это то, что я бы попробовал ....

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

Vector permutations = ... // получить перестановку, используя класс, аналогичный классу на сайте для массива целых чисел {0,1,2,3}

//The panel
JPanel  pane;
JButton button;
pane.setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();

//Choose one permutation at random
int foo = arcrandom() % 23;
int current[] = permutations.get(foo);

//Add the buttons in the chosen order
button = new JButton("Button 1");
c.gridx = current[0];
c.gridy = 0;
pane.add(button, c);

button = new JButton("Button 2");
c.gridx = current[1];
c.gridy = 0;
pane.add(button, c);

button = new JButton("Button 3");
c.gridx = current[2];
c.gridy = 0;
pane.add(button, c);

button = new JButton("Button 4");
c.gridx = current[3];
c.gridy = 0;
pane.add(button, c);

Дайте мне знать, если это работает!

0 голосов
/ 06 марта 2010

Спасибо за все ваши ответы!Я использовал тасовку Фишера-Йейтса!Я нашел здесь хорошее руководство, как использовать алгоритм в Objective-C: gorbster.net

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...