Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Delphi - [решено] Случайное перемешивание чисел

Ответить
Настройки темы
Delphi - [решено] Случайное перемешивание чисел

Старожил


Сообщения: 295
Благодарности: 30

Профиль | Отправить 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;
Задача этого кода - заполнить массив SortedSettingNumbers случайными числами в диапазоне от 0 до SettingCount-1 таким образом, чтобы числа не повторялись, т.е. по сути дела получить в массиве перемешанную последовательность чисел.

Есть два вопроса:
а) Как лучше переписать такой код, чтобы убрать goto, которое многие программисты не любят? Мне в голову это никак не придёт.
б) Хотелось бы также услышать предложения по ускорению этого кода, так как в будущем, возможно, придётся сильно увеличить константу SettingCount.

Отправлено: 16:20, 30-09-2012

 

Аватара для VladDV

Старожил


Сообщения: 247
Благодарности: 15

Профиль | Отправить PM | Цитировать


1) Создаем массив A длиной SettingCount с упорядоченными номерами ячеек: [0, 1, 2, 3,...., SettingCount - 1 ]
2) Создаем пустой массив B длины SettingCount и в цикле заполняем его по след принципу: случайным образом выбираем значение из массива А, вставляем его в текущую ячейку массива B, удаляем использованную ячейку из массива А.

В конце работы программы массив А будет пустым, а В - заполнен перемешанными числами.

На делфи писал лет 7 назад, лень вспоминать синтаксис, но думаю разберетесь.

Отправлено: 16:56, 30-09-2012 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Пользователь


Сообщения: 121
Благодарности: 35

Профиль | Отправить PM | Цитировать


Цитата Любезный:
Как лучше переписать такой код, чтобы убрать goto, »
Код: Выделить весь код
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
Благодарности: 30

Профиль | Отправить PM | Цитировать


Цитата:
//Зачем это условие
Блин... Это я сглючил. Конечно, на инициализированных значениях без этой проверки можно обойтись.

Цитата VladDV:
удаляем использованную ячейку из массива А. »
Не вижу смысла в использовании двух массивов сразу, тем более с удалением элементов одного массива, которое тоже потребует процессорного времени. Да, команда Move быстра, но когда элементов много, получается замедление.

Отправлено: 19:49, 01-10-2012 | #4



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Delphi - [решено] Случайное перемешивание чисел

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Перемешивание и сортировка в 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




 
Переход