Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.08.2017, 17:11   #11
Cuprum5
Форумчанин
 
Регистрация: 09.05.2017
Сообщений: 729
По умолчанию

Цитата:
Сообщение от goto ∞ Посмотреть сообщение
Код:
for k := 0 to i-1 do
- Так как же все нормально, подождите, товарищи. Вот кусок вышележащего цикла:
Цитата:
Сообщение от goto ∞ Посмотреть сообщение
Код:
for i := 0 to n-1 do
- вот тут первая итерация i = 0.
Возвращаемся к циклу ниже:
Цитата:
Сообщение от goto ∞ Посмотреть сообщение
Код:
for k := 0 to i-1 do
- вот тут будет ошибка: k = 0 to -1 - что есть неправильно, правильно или я опять туплю?:D
Cuprum5 вне форума Ответить с цитированием
Старый 13.08.2017, 17:53   #12
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от Cuprum5 Посмотреть сообщение
вот тут будет ошибка: k = 0 to -1 - что есть неправильно, правильно или я опять туплю?:D
не будет тут ошибки. цикл просто ни разу не выполнится.

попробуйте на досуге написать:
Код:
for k := 0 to -1 do WriteLn('Цикл');
и подсчитайте, сколько раз на экран будет выведено слово "Цикл"


goto ∞, а вообще, задача генерации случайных чисел без повторений на форуме поднималась неоднократно.
и тут я бы рекомендовал выбирать алгоритм в зависимости от задачи.
Если нужно получить 10 неповторящихся чисел в диапазоне от 1 до 1000,
то, конечно, лучше использовать ваш подход - генерить очередное число,
проверять по списку, не было ли такого числа раньше, если не было, то сохранять его в списке(массиве, наборе, коллекции, множестве и т.п.).
Это нужно всегда делать, когда диапазон чисел во много раз больше, чем необходимое число случайных чисел.
Но вот если нужно сгенерировать n случайных числе в диапазоне 1..n, то такой подход однозначно ПЛОХ!
гораздо проще, быстрее и эффективней заполнить массив числами подряд, потом перемешать массив.
Кстати, на форуме я приводил алгоритм и код "правильного" перемешивания массива.
Если есть затруднени в поиске, могу дать ссылочку на тему.

Последний раз редактировалось Serge_Bliznykov; 13.08.2017 в 18:01.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 13.08.2017, 22:07   #13
goto ∞
Форумчанин
 
Аватар для goto ∞
 
Регистрация: 21.12.2010
Сообщений: 155
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
не будет тут ошибки. цикл просто ни разу не выполнится.

попробуйте на досуге написать:
Код:
for k := 0 to -1 do WriteLn('Цикл');
и подсчитайте, сколько раз на экран будет выведено слово "Цикл"


goto ∞, а вообще, задача генерации случайных чисел без повторений на форуме поднималась неоднократно.
и тут я бы рекомендовал выбирать алгоритм в зависимости от задачи.
Если нужно получить 10 неповторящихся чисел в диапазоне от 1 до 1000,
то, конечно, лучше использовать ваш подход - генерить очередное число,
проверять по списку, не было ли такого числа раньше, если не было, то сохранять его в списке(массиве, наборе, коллекции, множестве и т.п.).
Это нужно всегда делать, когда диапазон чисел во много раз больше, чем необходимое число случайных чисел.
Но вот если нужно сгенерировать n случайных числе в диапазоне 1..n, то такой подход однозначно ПЛОХ!
гораздо проще, быстрее и эффективней заполнить массив числами подряд, потом перемешать массив.
Кстати, на форуме я приводил алгоритм и код "правильного" перемешивания массива.
Если есть затруднени в поиске, могу дать ссылочку на тему.
Интересный вариант, кидайте ссылочку тогда, главное что бы код был не громоздким а простым и малым
goto ∞ вне форума Ответить с цитированием
Старый 14.08.2017, 00:03   #14
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от goto ∞ Посмотреть сообщение
Интересный вариант, кидайте ссылочку тогда, главное что бы код был не громоздким а простым и малым
ссылочка - ВОТ


а код получается простым:
Код:
const n=10;
var
 i,k,buf:integer;
 digitarray : array of integer; 
begin
  randomize;                   // иницилизируем ГПСЧ
  setlength(digitarray,n);     // Устанавливаем размер массива равной числу объектов

  //заполнить числами от 
  for i:=0 to n-1 do digitarray[i]:=i;

  //перемешать числа в массиве
  for i:=0 to N-2 do begin
   k:= Random(N-i)+i;
   if k<>i then begin
     buf:=digitarray[i];
     digitarray[i]:=digitarray[k];
     digitarray[k]:=buf;
   end;
  end;


.....
   вывести числа по порядку из массива digitarray ( если нужно, то можно взять первые X чисел (любое число до n)

Последний раз редактировалось Serge_Bliznykov; 14.08.2017 в 00:05.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Датчик случайных чисел генерирует числа от 0 до 255. Нужно перевести числа в их символьное представление. Остановка программы - любая клавиша. julu199 Помощь студентам 2 19.09.2016 12:24
Датчик случайных чисел генерирует числа от 0 до 255. Нужно перевести числа в их символьное представление. Остановка программы – появление символа «*». Сколько символов было напеч julu199 Помощь студентам 1 19.09.2016 12:20
есть код который генерирует md5. Но не пойму как его вызывать pompiduskus Общие вопросы C/C++ 30 18.08.2014 00:03
Записать в файле g все числа файлов c и d без повторений и в порядке возрастания imeugene Помощь студентам 0 23.05.2013 16:30
Delphi. random, случайные числа без повторений MerCY Помощь студентам 8 10.05.2010 15:19