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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.05.2019, 15:41   #1
anaschu
Форумчанин
 
Регистрация: 21.09.2012
Сообщений: 372
По умолчанию Бесконечный цикл Until Random

Тут меня всё выходит на бесконечный цикл. переменная Z постоянно равна нулю, несмотря на то, что я использую рандом. В чём дело?

Код:
function TModel.ChoiceForMarriage1_1_1_1_0(x,y:integer):integer;
var
qpeople,i,z:integer;
begin
  z:=-2;
  //Randomize();
  qpeople:=length(FField.FArea[X, Y].Ffamily.APeople)-1;
  repeat
  begin
    Randomize();
    z:=Random(qpeople)    ;
    if not (z-1<=qpeople) and (FField.FArea[X, Y].Ffamily.APeople[z].sex) then
    begin
     Result:=z;
     exit;
    end
    else z:=-2;
  end;
  Until z>-1;


end;
Занимаюсь:1.зверьком- покемончиком для компьютерного затончика. 2 IT-грибами,что бы скушать потом их с вами.3. цифровым обезьянками, как куны ударяют за тянками
anaschu вне форума Ответить с цитированием
Старый 28.05.2019, 15:50   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

not (z-1<=qpeople) <=> z-1>qpeople и это всегда False => if всегда на else
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 28.05.2019, 16:09   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Randomize() нужно вызывать строго один раз (однократно). Желательно при старте приложения или формы.


Цитата:
Сообщение от anaschu Посмотреть сообщение
qpeople:=length(FField.FArea[X, Y].Ffamily.APeople)-1;
чему равно qpeople ?
если меньше двух, то ничего, кроме нуля, вы в рандом и не получите


Цитата:
Сообщение от Аватар Посмотреть сообщение
not (z-1<=qpeople) <=> z-1>qpeople и это всегда False => if всегда на else
упс. я опоздал.
уже дали объяснение!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 28.05.2019, 16:28   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от anaschu Посмотреть сообщение
if not (z-1<=qpeople) and (FField.FArea[X, Y].Ffamily.APeople[z].sex) then
и для чего вообще нужна ChoiceForMarriage1_1_1_1_0 ?
можете описать её назначение/описание алгоритма?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 28.05.2019, 17:33   #5
anaschu
Форумчанин
 
Регистрация: 21.09.2012
Сообщений: 372
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
not (z-1<=qpeople)
если NOT убрать, все равно бесконечный цикл. проблема в том, что z всё время приарвнивается к нулю во время работы рандома

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
и для чего вообще нужна ChoiceForMarriage1_1_1_1_0
Есть массив Apeople, состоящий из man. Man бывает мужчина и женщина (Ох уж этот сексистский английский). То есть sex=true мужчина, sex=false- женщина (привет феминисткам!).
Когда приходит время размножаться, губки накрашены, чулки одеты, бабцу с индексом i внутри Apeople нужно найти себе мужа.
Эта процедура ей таки находит этого мужа через рандомайз (где то в старых версиях проги выбиралось по доброте и баборабству ( для высокоресурсных услвоий) и по агрессивности и мужской кооперации (для низкоресурсных).
Тогда бабца с индексом i берет себе в мужья кунца с индексом, который ему даст эта функция ChoiceForMarriage1_1_1_1_0

Всё это нужно для моделирования эволюционного перехода от ардипитеков к питеккантропам, бонобо и человеку

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
меньше двух
поставил z=-1, все равно та же петрушка вроде бы...а блин.
Эмбракадеро на обоих компах слетела- регистрация нафиг убилась. У меня на компе стоит клон сстемы с другого точно такого же компа. Я тут не могу быть админом, что ли...В общем, почему то файл hosts не правится. Хотя на другом компе, Где я просто винду ставил, та же ерунда.

git@gitlab.com:anaschu/soc_mod_woman_man.git

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

Чтоб добавить что-то к своему сообщению, используйте кнопку "Правка", а не пишите несколько сообщений подряд.
Занимаюсь:1.зверьком- покемончиком для компьютерного затончика. 2 IT-грибами,что бы скушать потом их с вами.3. цифровым обезьянками, как куны ударяют за тянками

Последний раз редактировалось Вадим Мошев; 28.05.2019 в 17:52.
anaschu вне форума Ответить с цитированием
Старый 28.05.2019, 17:59   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Код:
  qpeople:=length(FField.FArea[X, Y].Ffamily.APeople)-1;
во-первых, уберите -1

а во-вторых, чему равен размен массива APeople ?
Вы же в отладчике смотрели?
и что должна вернуть функция, если в массиве нет мужчин?
и где у Вас проверка на то, что в массиве вообще нет мужчин?
А один и тот же мужчина может выбираться для разных женщин?

я уже молчу о том, что массив почему-то является свойством области с координатами X,Y o_O
Serge_Bliznykov вне форума Ответить с цитированием
Старый 28.05.2019, 18:23   #7
anaschu
Форумчанин
 
Регистрация: 21.09.2012
Сообщений: 372
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
размен массива APeople
от двух
Занимаюсь:1.зверьком- покемончиком для компьютерного затончика. 2 IT-грибами,что бы скушать потом их с вами.3. цифровым обезьянками, как куны ударяют за тянками
anaschu вне форума Ответить с цитированием
Старый 28.05.2019, 18:25   #8
anaschu
Форумчанин
 
Регистрация: 21.09.2012
Сообщений: 372
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
и что должна вернуть функция, если в массиве нет мужчин?
Тогда процедура, которая вызывает эту функцию, не сработает. Я медленно работаю и рассеянный. Поэтапно буду решать траблики.
с этим потом буду разбираться. Пока обсуждаемая функция не может ничего вернуть, даже если в массиве есть мужчины. Она циклиться

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
А один и тот же мужчина может выбираться для разных женщин?
может

К сожалению, на пару часов я выбываю
Занимаюсь:1.зверьком- покемончиком для компьютерного затончика. 2 IT-грибами,что бы скушать потом их с вами.3. цифровым обезьянками, как куны ударяют за тянками

Последний раз редактировалось anaschu; 28.05.2019 в 18:28.
anaschu вне форума Ответить с цитированием
Старый 29.05.2019, 12:57   #9
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Код:
  qpeople:=length(FField.FArea[X, Y].Ffamily.APeople)-1; //уже говорили
  repeat
  begin
    Randomize(); // аналогично
    z:=Random(qpeople)    ;
    if not (z-1<=qpeople) and (FField.FArea[X, Y].Ffamily.APeople[z].sex) // по "определению" Random 0<z<qpeople и проверять это НЕЗАЧЕМ.
// А если там нет НИ ОДНОГО нужного пола??? мы так и будем искать то чего там нет?! и делать это бесконечно...
then
    begin
     Result:=z;
     exit;
    end
    else z:=-2;
  end;
  Until z>-1;
Код:
existsSex:=false;
for j:=0 to length(FFiled.Farea[X,Y].Ffamily.Apeople)-1 do
  existsSex:=existsSex or (FFiled.Farea[X,Y].Ffamily.Apeople[j].sex);

if existsSex then begin// будем искать
...
end
else result:=-1;???
repeat
 z:=Random(...);
 if not existssex then z:=qpeople //-2 // <>-1 !!!
 else if not (....[z].sex) then z:=-1
else result:=z ;
until z<>-1;
result:=z;
программа — запись алгоритма на языке понятном транслятору
evg_m на форуме Ответить с цитированием
Старый 29.05.2019, 21:12   #10
anaschu
Форумчанин
 
Регистрация: 21.09.2012
Сообщений: 372
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
А один и тот же мужчина может выбираться для разных женщин?
Цитата:
Сообщение от evg_m Посмотреть сообщение
по "определению" Random 0<z
у меня z постоянно равен нулю и не меняется
Занимаюсь:1.зверьком- покемончиком для компьютерного затончика. 2 IT-грибами,что бы скушать потом их с вами.3. цифровым обезьянками, как куны ударяют за тянками
anaschu вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Бесконечный цикл Алексей_2012 Общие вопросы Delphi 10 24.04.2013 08:27
Бесконечный цикл. Тошка Помощь студентам 6 12.03.2011 17:50
Бесконечный цикл. Kingdom_Reborn Помощь студентам 4 11.11.2010 00:18
цикл...и по ходу бесконечный... victum Помощь студентам 10 07.01.2009 15:57
Бесконечный цикл Эдуард Общие вопросы C/C++ 4 03.04.2008 17:28