Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
107 / 107 / 21
Регистрация: 29.08.2012
Сообщений: 453
1

Random в цикле

24.04.2013, 13:14. Показов 1632. Ответов 16
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, форумчане.
Я столкнулся с такой проблемой, когда написал программу для генерации судоку.
Программа генерирует массив 9х9 по правилам судоку. Цифры ставятся случайно и проверяеются повторы в линиях и квадратах 3х3. Если цифра уже есть, то генерируется новое значение. Однако не всегда можно таким образом с первого раза подобать нужные комбинации. Я поставил цикл, который после определенного количества ходов, обнуляет массив и всё идёт заново. Тут тоже поставил ограничение, чтобы программа не зависала надолго. Я уже думал, что всё впорядке, но потом заметил, что после раза 200(приблизительно) программа в 99% выдает ошибку. После этого снова необходимо нажимать кнопку. С чем это связано?
Вот та часть кода, где генерируется поле. Знаю, что код во многих местах следовало бы подправить, но пока интерисует вопрос с циклом.

n - кол-во перебранных значений.
ng - кол-во перезапусков процедуры.

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
procedure Generate;
var i,j : integer;
    a : boolean;
begin
for i:=0 to size do
 for j:= 0 to size do
  Mass[i,j]:=0;
n:=0;
Inc(ng);
if ng>299 then  exit;
randomize;
for i:=0 to size do
 for j:= 0 to size do
  repeat
   mass[i,j] := Random(size+1)+1;
    If CheckOnLines(i,j,0,0) then
     If CheckOnQuad(i,j,0,0) then a:=true
     else a:=false else a:=false;
  inc(n);
  if n>60000 then generate;
  if ng>299 then  exit;
  until a=true;
for i:= 0 to 8 do
 for j := 0 to 8 do
  ResultMass[i,j] := Mass[i,j];
Form1.Label1.Caption := IntToStr(n);
Form1.Label2.Caption := Inttostr(ng);
end;
Заранее спасибо.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.04.2013, 13:14
Ответы с готовыми решениями:

Заполнить список (компонент ListBox) каждым вторым числом, генерируемым Random в цикле (while)
Задание № 1. Заполнить список (компонент ListBox) каждым вторым числом, генерируемым Random в...

Random в цикле
Можно ли сделать так, чтобы переменная enemydmg в цикле постоянно менялась, а не оставалась...

Поведение %random% в цикле
Всем привет. Кто нибудь пробовал вывести %random% в цикле? Вот что получается: for /l %i in...

Random в цикле дает одно значение
Random RandomNum = new Random(); while (i < 50) { X =...

16
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
24.04.2013, 14:12 2
http://parsers.info/2009/03/re... -statejka/
0
107 / 107 / 21
Регистрация: 29.08.2012
Сообщений: 453
24.04.2013, 14:14  [ТС] 3
Я не хочу использовать чужой код. Знаю, что изобретаю велосипед, но уже дело принципа.
Да и вообще стало интересно почему такая ситуация возникла.
0
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
24.04.2013, 14:20 4
Цитата Сообщение от Arkaniy Посмотреть сообщение
интересно почему такая ситуация возникла
Было бы интересно - удосужился бы вникнуть в смысл текста сообщения об ошибке.
0
107 / 107 / 21
Регистрация: 29.08.2012
Сообщений: 453
24.04.2013, 14:22  [ТС] 5
Собственно говоря, текст ошибки.
Pascal
1
2
3
4
If ng>299 then
 begin
  Image1.Picture := nil;
  ShowMessage('Ошибка генерации');
Если этого ограничения не сделать, то программа просто зависает.
Не может же быть что из тысячи вариантов ни один не подходит, в то время как если нажать кнопку 4-5 раз,тоесть по 299 раз пройтись раз 4-5, успешно завершается.
0
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
24.04.2013, 14:26 6
Это не ошибка.
0
107 / 107 / 21
Регистрация: 29.08.2012
Сообщений: 453
24.04.2013, 14:29  [ТС] 7
Как это называется не имеет значения. Программа без этого ограничения зависает.
Если поставить порог на 10000, то результат тотже. Если в первые ~200 раз не сгенерирует, то будет висеть до достижения отметки в 10000 и остановится. Почему так происходит?
0
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
24.04.2013, 14:31 8
Цитата Сообщение от Arkaniy Посмотреть сообщение
Не может же быть что из тысячи вариантов ни один не подходит
Запросто может.

Добавлено через 2 минуты
Цитата Сообщение от Arkaniy Посмотреть сообщение
Программа без этого ограничения зависает
Зависание - это не ошибка.
0
107 / 107 / 21
Регистрация: 29.08.2012
Сообщений: 453
24.04.2013, 14:34  [ТС] 9
Цитата Сообщение от Arkaniy Посмотреть сообщение
Если поставить порог на 10000, то результат тотже. Если в первые ~200 раз не сгенерирует, то будет висеть до достижения отметки в 10000 и остановится. Почему так происходит?
По-вашему, если это уже закономерность, а не случайные несколько раз, то это в порядке вещей?

Я не говорил, зависание - это ошибка. Я знаю, что это. Если хотя бы 1 раз массив сгенерировался раза эдак с 2000, то я поверил бы, что тут всё на волю случая.
0
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
24.04.2013, 14:39 10
Ты пытаешься наитупейшим образом реализовать алгоритм наитупейшего перебора, вместо того чтобы вникнуть другой, гораздо более эффективный алгоритм, ссылка на одну из реализаций которого тебе дана.

Добавлено через 40 секунд
Где у тебя вызов Randomize() ?
Он вообще у тебя есть ?
0
107 / 107 / 21
Регистрация: 29.08.2012
Сообщений: 453
24.04.2013, 14:44  [ТС] 11
Я еще раз говорю, что не хочу использовать чужой код. Пускай мой алгоритм тупой до безобразия, меня это не смущает. Я привык всё делать не спеша и постепенно. Мне интересно самому найти у себя ошибки в алгоритме и совершенствовать свой код.

Я зашел в тупик относительно моей проблемы. Знаю, что судоку можно реализовать намного проще, но теперь уже просто интересно, почему генерация происходит именно таким образом.

Добавлено через 40 секунд
Randomize - 11 строка.
0
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
24.04.2013, 14:50 12
Цитата Сообщение от Arkaniy Посмотреть сообщение
не хочу использовать чужой код
Да никто не заставляет тебя его использовать !
Он для анализа алгоритма нужен, а не для тупого передирания)


Цитата Сообщение от Arkaniy Посмотреть сообщение
можно реализовать намного проще,
Не проще, а правильно.
0
107 / 107 / 21
Регистрация: 29.08.2012
Сообщений: 453
24.04.2013, 14:56  [ТС] 13
Вот вообще не хочу смотреть чужой код. Упрямый я)
Да меня и не это уже интерисует. Я сделал программу, которая генерирует поле. Без какой-либо сторонней помощи.
Но почему же только первые 200 раз? Почему я не могу установить порог в 50000 и уйти обедать, зная, что когда вернусь, то будет хотя бы 15 готовых результатов?
0
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
24.04.2013, 14:59 14
Цитата Сообщение от Arkaniy Посмотреть сообщение
привык всё делать не спеша и постепенно
Раз так, то вооружаешься встроенным отладчиком и вперед искать причины своей "проблемы".
На то отладчик и существует.

Добавлено через 3 минуты
Цитата Сообщение от Arkaniy Посмотреть сообщение
Упрямый я
Ослиное упрямство.


Цитата Сообщение от Arkaniy Посмотреть сообщение
не хочу смотреть чужой код
Хоть себе бы не врал - не "не хочу", а "не могу и не умею читать код".
0
107 / 107 / 21
Регистрация: 29.08.2012
Сообщений: 453
24.04.2013, 16:10  [ТС] 15
Mss,благодарю за потраченное время.
Буду копаться в отладчике,однако вопрос всё же остается открытым.

Добавлено через 1 час 8 минут
Таки разобрался. Проблема в рекурсии была.
0
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
24.04.2013, 16:18 16
Рекурсия во многих алгоритмах "судокуподобных" генераторов - вещь вельми полезная, порой и незаменимая.
Но, разумеется, не пришитая ни в красную армию, как у тебя это сделано.
0
107 / 107 / 21
Регистрация: 29.08.2012
Сообщений: 453
24.04.2013, 16:24  [ТС] 17
Ну что ж, сейчас буду разбирать всё. Эту проблему решил, вылезло еще 3.
Со временем приведу и свой код в порядок.
0
24.04.2013, 16:24
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.04.2013, 16:24
Помогаю со студенческими работами здесь

Генерация ряда чисел используя random в цикле
Добрый день. Задача такая, нужно найти ряд цифр, например 1, 2, 3, 4, 5 при генерации случайных...

Что не так с 'Random' или There is no overloaded version of 'Random' that can be called with these arguments
Доброго времени суток! Я с программированием на "Вы", поэтому очень прошу доходчиво объяснить, что...

Random, повторы при static Random(1 seed)
Добрый вечер. Использую private static readonly Random, так как крутится в цикле и если убрать...

У меня непонятки с методами Math.random() и Random()
Задача : заполнить массив из 15 элементов случайным образом вещественными значениями х (-5 <= x <=...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru