2016-03-20 2 views
0

У меня есть 5 элементов, которые я хочу распространять в таблице с тремя строками, шириной 6 столбцов без перекрытия.Рандомизированное положение для 5 элементов в таблице 3x6

Позиции обозначаются координатами [x, y].

Положение этих элементов изменяется с каждым тиком компонента таймера.

Элементы типа TImage.

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

ответ

5

То, что вы пытаетесь сделать, состоит в том, чтобы равномерно выбирать образец из конечного набора без замены.

  1. Создайте массив, содержащий 18 возможных местоположений.
  2. Выполните a Fisher-Yates shuffle.
  3. Возьмите первые пять мест после перетасовки.

Поскольку таскалка Fisher-Yates определяет первое значение после первой итерации, второе значение и вторую итерацию и т. Д., Вы можете прервать перетасовку после пяти итераций. Этот вариант известен как частичный переполох Фишера-Йейта. Производительность при выборе 5 из 18 не велика, но представьте себе выбор из гораздо большего населения.

Что касается ваших 18 местоположений, то будет создан массив, содержащий первые 18 целых чисел. Тогда это простое использование div и mod для отображения строки и столбца.

+0

Большое спасибо за ваш совет, но я застрял в создании массива. Получение ошибки в том, что мой номер элементов отличается от объявленного числа: ----- pozice: Array [1..6,1..3] of integer = ((50,210,370,530,690,850), (45 200 355)); – Tallmios

+0

Это не имеет для меня никакого смысла. Вам нужен 1D массив длиной 18. –

+0

Этот массив инициализируется с 0 по 17. Затем вы перетасовываете его и делаете первые 5 записей. Карта для row/col с div 6 и mod 6. –

0

Когда там гораздо больше свободного пространства, чем элементы, простейший возможный метод очень эффективен и дает правильное распределение:

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

Это простая вариация метода, часто используемая в Монте-Карло, которая называется отбраковкой (https://en.wikipedia.org/wiki/Rejection_sampling).

+0

Это на самом деле то, что я пробовал один раз, но у меня возникла проблема, когда алгоритм нашел совпадение, что второй элемент просто исчез, не получив другую позицию, потому что весь процесс может произойти только один раз во время тикания таймера (разработка в Delphi). – Tallmios

+0

@Tallmios Используйте цикл repeat..unit внутри обработчика события таймера, поэтому вы найдете правильное положение для каждого нового элемента. –

+0

@ Tallmios Очевидно, что ваш код неверен, но вы его не показывали. Отсюда и концептуальные ответы. Готов поспорить, что все смешано с графическим интерфейсом в потоке TForm. Правильно подобранный код делает эти проблемы простыми. Больших шашек спагетти запутанных нитей нет. –

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