|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Delphi - [решено] Случайное перемешивание чисел |
|
Delphi - [решено] Случайное перемешивание чисел
|
Старожил Сообщения: 295 |
Профиль | Отправить PM | Цитировать Приветствую уважаемых коллег. Хочу обсудить с вами такой вопрос. В один из своих проектов я недавно добавил такой код:
const SettingCount = 15; var SortedSettingNumbers: array [0..SettingCount-1] of smallint; i, j, r: smallint; label lab1; ... for I:=0 to SettingCount-1 do SortedSettingNumbers [i]:=-1; Randomize; for I:=0 to SettingCount-1 do if SortedSettingNumbers [i]=-1 then begin lab1: r:=Random (SettingCount); // проверить сгенерированное число на повтор b:=false; for j:=0 to SettingCount-1 do if SortedSettingNumbers [j]=r then begin b:=true; break; end; // если повторяется - сгенерить другое if b then goto lab1; SortedSettingNumbers [i]:=r end; Есть два вопроса: а) Как лучше переписать такой код, чтобы убрать goto, которое многие программисты не любят? Мне в голову это никак не придёт. б) Хотелось бы также услышать предложения по ускорению этого кода, так как в будущем, возможно, придётся сильно увеличить константу SettingCount. |
|
Отправлено: 16:20, 30-09-2012 |
Старожил Сообщения: 247
|
Профиль | Отправить PM | Цитировать 1) Создаем массив A длиной SettingCount с упорядоченными номерами ячеек: [0, 1, 2, 3,...., SettingCount - 1 ]
2) Создаем пустой массив B длины SettingCount и в цикле заполняем его по след принципу: случайным образом выбираем значение из массива А, вставляем его в текущую ячейку массива B, удаляем использованную ячейку из массива А. В конце работы программы массив А будет пустым, а В - заполнен перемешанными числами. На делфи писал лет 7 назад, лень вспоминать синтаксис, но думаю разберетесь. |
Отправлено: 16:56, 30-09-2012 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Пользователь Сообщения: 121
|
Профиль | Отправить PM | Цитировать Цитата Любезный:
const SettingCount = 15; var SortedSettingNumbers: array [0..SettingCount-1] of smallint; i, j, r: smallint; label lab1; ... for I:=0 to SettingCount-1 do SortedSettingNumbers [i]:=-1; //Инициализация значений элементов массива? А нужно ли? Randomize; for I:=0 to SettingCount-1 do if SortedSettingNumbers [i]=-1 //Зачем это условие then begin b:=true; repeat begin r:=Random (SettingCount); // проверить сгенерированное число на повтор for j:=0 to SettingCount-1 do if SortedSettingNumbers [j]=r then begin b:=false; break; end; end; until b; // если повторяется - сгенерить другое SortedSettingNumbers [i]:=r; end; По поводу оптимизации смотрите мои комментарии. |
|
Отправлено: 10:49, 01-10-2012 | #3 |
Старожил Сообщения: 295
|
Профиль | Отправить PM | Цитировать Цитата:
Цитата VladDV:
|
||
Отправлено: 19:49, 01-10-2012 | #4 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Перемешивание и сортировка в INI файле | Centrinar | AutoIt | 39 | 23-06-2011 03:11 | |
C/C++ - [решено] Как сгенерировать случайное число на всем диапазоне значений int? | Michael | Программирование и базы данных | 14 | 04-02-2011 17:08 | |
C/C++ - Последовательность чисел | denver-312 | Программирование и базы данных | 7 | 02-01-2008 20:54 | |
сортировка чисел | slaine | Вебмастеру | 12 | 18-02-2006 20:17 | |
Генерирование случайны чисел в С++ | Belka007 | Программирование и базы данных | 12 | 23-11-2003 22:19 |
|