Форум программистов  
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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

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

Цитата:
Сообщение от 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, 18:53   #12
Serge_Bliznykov
МегаМодератор
СуперМодератор
 
Регистрация: 09.01.2008
Сообщений: 22,623
Репутация: 5062
По умолчанию

Цитата:
Сообщение от 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 в 19:01.
Serge_Bliznykov на форуме   Ответить с цитированием
Старый 13.08.2017, 23:07   #13
goto ∞
Форумчанин
 
Аватар для goto ∞
 
Регистрация: 21.12.2010
Адрес: 0x0000-0x9FFFFF
Сообщений: 113
Репутация: 9
По умолчанию

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

попробуйте на досуге написать:
Код:

for k := 0 to -1 do WriteLn('Цикл');

и подсчитайте, сколько раз на экран будет выведено слово "Цикл"


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

Цитата:
Сообщение от 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 в 01:05.
Serge_Bliznykov на форуме   Ответить с цитированием
Ответ



Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Датчик случайных чисел генерирует числа от 0 до 255. Нужно перевести числа в их символьное представление. Остановка программы - любая клавиша. julu199 Помощь студентам 2 19.09.2016 13:24
Датчик случайных чисел генерирует числа от 0 до 255. Нужно перевести числа в их символьное представление. Остановка программы – появление символа «*». Сколько символов было напеч julu199 Помощь студентам 1 19.09.2016 13: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




11:40.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.

купить трафик


как улучшить посещаемость, а также решения по монетизации сайтов, видео и приложений

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru