Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2006.02.05;
Скачать: [xml.tar.bz2];

Вниз

Создание генератора случайных билетов.   Найти похожие ветки 

 
kyn66 ©   (2005-12-29 16:34) [0]

Уважаемые мастера. Мною (не без Вашей помощи) была написана программа для проверки лотерейных билетов "Суперлото" и "Ваше лото". Кого интересует - может заценить http://yurec66.narod.ru . Сейчас у меня возникла идея для сохдания генератора случайных билетов, чтобы проверить программу на большом количестве билетов, т.к. набирать
вручную влом. Едея следующая:
1) Создаем массив из тридцати чисел в диапазоне 1-:-90 спасибо Verg;
2) Согласно определенным правилам, расставляем полученные числа в StringGrid
 (так надо, поверьте)
3)Самое главное !!! числа должны расставляться каждая в свою ячейку
 согласно описаному ниже правилу

Var
 A : array[1..30] of integer; // <--{полученный массив}
begin
 ...
 i := 1;
 for k := 0 to 5 do
  for m := 0 to 4 do
   begin
     case (A[i]) of
       1..9   : n := 0;
       10..19 : n := 1;
       20..29 : n := 2;
       30..39 : n := 3;
       40..49 : n := 4;
       50..59 : n := 5;
       60..69 : n := 6;
       70..79 : n := 7;
       80..90 : n := 8;
     end; {Case}

     StringGrid1.Cells[n, k] := IntToStr(A[i]);
     Inc(i);
   end;  
 ...
end;


Проблема заключается в следующем. Как Вы видите, числа из массива выбираются по 5,
т.к. в билете 6 строк по 9 столбцов в каждой а цифр в строке может быть только 5.
И вот, вставляя числа из массива, может выпасть так, что число 5 и 3 могут быть в
одной пятерке, а так не должно быть, в противном случае число 3 (если идет после 5
в пятерке - займет ее позицию). Долго не мог понять, почему в некоторых строках у
меня не по 5 чисел. А дело именно в этом.
Подскажите, как придумать правильный алгоритм распределения чисел по ячейкам ???
Это наверное что-то получается случайный массив в случайном массиве?

Спасибо.


 
Zeqfreed ©   (2005-12-29 19:28) [1]

kyn66 ©   (29.12.05 16:34)

type
 TLotteryTicketArray = array[0..8, 0..5] of Integer;

...

procedure GenerateLotteryTicket(out lta : TLotteryTicketArray);
var
i, j, k : Integer;
genarr : array[0..89] of Boolean;
randarr : array[0..29] of Byte;
begin
for i := 0 to 8 do
 for j := 0 to 5 do begin
  lta[i, j] := 0;
 end;

Randomize();
for j := 0 to 5 do
 for k := 0 to 3 do begin
  repeat
   i := Random(9);
  until (lta[i, j] <> -1);

  lta[i, j] := -1;
 end;

for i := 0 to 89 do
 genarr[i] := false;

for j := 0 to 5 do
 for i := 0 to 8 do begin
  if lta[i, j] <> -1 then begin
   repeat
    k := RandomRange(i * 10, i * 10 + 10);
   until (not genarr[k]);

   genarr[k] := true;
   lta[i, j] := k;
  end;
 end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
lta : TLotteryTicketArray;
i, j : Integer;
begin
for i := 0 to 8 do
 for j := 0 to 5 do
  StringGrid1.Cells[i, j] := "";

GenerateLotteryTicket(lta);
for i := 0 to 8 do
 for j := 0 to 5 do begin
  if lta[i, j] <> -1 then
   StringGrid1.Cells[i, j] := IntToStr(lta[i, j]);
 end;
end;


Разбирайся :)


 
Zeqfreed ©   (2005-12-29 19:35) [2]

Zeqfreed ©   (29.12.05 19:28) [1]

type
 TLotteryTicketArray = array[0..8, 0..5] of Integer;

...

procedure GenerateLotteryTicket(out lta : TLotteryTicketArray);
var
 i, j, k : Integer;
 genarr : array[0..90] of Boolean;
 randarr : array[0..29] of Byte;
begin
 for i := 0 to 8 do
  for j := 0 to 5 do begin
   lta[i, j] := 0;
  end;

 Randomize();
 for j := 0 to 5 do
  for k := 0 to 3 do begin
   repeat
    i := Random(9);
   until (lta[i, j] <> -1);

   lta[i, j] := -1;
  end;

 for i := 1 to 89 do
  genarr[i] := false;

 genarr[0] := true;
 genarr[90] := true;


 for j := 0 to 5 do
  for i := 0 to 8 do begin
   if lta[i, j] <> -1 then begin
    repeat
     k := RandomRange(i * 10, i * 10 + 10);
    until (not genarr[k]);

    genarr[k] := true;
    lta[i, j] := k;
   end;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 lta : TLotteryTicketArray;
 i, j : Integer;
begin
 for i := 0 to 8 do
  for j := 0 to 5 do
   StringGrid1.Cells[i, j] := "";

 GenerateLotteryTicket(lta);
 for i := 0 to 8 do
  for j := 0 to 5 do begin
   if lta[i, j] <> -1 then
    StringGrid1.Cells[i, j] := IntToStr(lta[i, j]);
  end;
end;


Как обычно, отослал не проверив достаточно хорошо. Приходится исправлять :)

Так же к коду прилагается небольшая оговорка: данный алгоритм иногда создает массив с полностью пустым столбцом. Насколько я знаю, в реальных билетах такого не бывает. Так что есть к чему стремиться ;)


 
kyn66 ©   (2005-12-30 10:21) [3]

Нуксь, посмотрим...


 
evvcom ©   (2005-12-30 10:46) [4]


>      case (A[i]) of
>        1..9   : n := 0;
>        10..19 : n := 1;
>        20..29 : n := 2;
>        30..39 : n := 3;
>        40..49 : n := 4;
>        50..59 : n := 5;
>        60..69 : n := 6;
>        70..79 : n := 7;
>        80..90 : n := 8;
>      end; {Case}

n := A[i] div 10;
if n = 9 then
 Dec(n);


 
kyn66 ©   (2005-12-30 11:14) [5]

>> evvcom
Спасибо 8-)

>>Zeqfreed
Ну что я хочу сказать... Класс, в принципе все работает, однако я так и не увидел, чтобы появилось число 90 8-(. Что-то с кодом?
Если коллега не возражает, я впишу Ваше имя в About своей программы, как мастера, помогавшего в разработке программы 8-). А ?


 
Zeqfreed ©   (2005-12-30 11:22) [6]

kyn66 ©   (30.12.05 11:14) [5]

> я так и не увидел, чтобы появилось число 90

Я просто почему-то думал, что число 90 не является допустимым. Чтобы оно тоже появлялось достаточно убрать строку

genarr[90] := true;

и цикл от 1 до 89 заменить на цикл от 1 до 90.


> Если коллега не возражает, я впишу Ваше имя в About
> своей программы, как мастера, помогавшего в разработке
> программы 8-). А ?

Ну, до мастера мне ещё далеко ;)
Но, если уж хочется вписать, то я, в общем-то, не против :)


 
kyn66 ©   (2005-12-30 11:56) [7]

>> Zeqfreed ©   (30.12.05 11:22) [6]
Я в принцИпе так и думал, вот тока про чтобы убрать вааще genarr[90] := true; не подумал
ЗЫ: Для вписания координат мне нужны данные(Имя, Фамилия), в данных я увидел тока Максим. Можно прислать мне на мыло(см. на моем сайтике с программой) 8-)


 
kyn66 ©   (2005-12-30 12:45) [8]

>> Zeqfreed
Выполнил все указания - всеравно не появляется 90 8-((( может здесь чего надо изменить?

var
 i, j, k : Integer;
genarr : array[0..90] of Boolean;
 randarr : array[0..29] of Byte;


 
Zeqfreed ©   (2005-12-30 13:30) [9]

kyn66 ©   (30.12.05 12:45) [8]
Да, видимо в справке имеется в виду не то, что написано и RandomRange генерирует числа включая только нижнюю границу диапазона (исходный код говорит об этом же). Тогда ко всем предыдущим исправлениям нужно добавить это:

    k := RandomRange(i * 10, i * 10 + 10);

поменять на

    if i < 8 then
     k := RandomRange(i * 10, i * 10 + 10)
    else
     k := RandomRange(80, 91);


 
kyn66 ©   (2005-12-30 14:48) [10]

>> Zeqfreed
8-))) Пока достучался , чтобы сообщить , что сам нашел решение...
я сделал так:

   repeat
     if i = 8 then
      k := RandomRange(i * 10, i * 10 + 11)
     else
      k := RandomRange(i * 10, i * 10 + 10);


PS:
Как насчет ФИО? Внесу в свою программу. Я кстати, отсылал мыло. Если получали - пришлите ответно.


 
Zeqfreed ©   (2005-12-30 15:21) [11]

kyn66 ©   (30.12.05 14:48) [10]
То, что сами нашли решение – очень хорошо, значит код более-менее понятный :) Там, кстати, объявление randarr лишнее, можно смело удалять ;)


> Как насчет ФИО? Внесу в свою программу. Я кстати,
> отсылал мыло. Если получали - пришлите ответно.

Не знаю, не люблю я слишком светиться ;) Если без фамилии никак, то лучше не надо, тем более, она никому ничего не скажет :) Я бы предпочел ник, если уж на то пошло.


 
kyn66 ©   (2005-12-30 17:02) [12]

>> Zeqfreed
Там, кстати, объявление randarr лишнее, можно смело удалять
И это нашел и убрал тоже сам 8-)
А ник тоже подойдет. Спасибо за помощь !



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2006.02.05;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.017 c
3-1134114728
ligor
2005-12-09 10:52
2006.02.05
FastReport 2.5


3-1133543772
VadimSpb
2005-12-02 20:16
2006.02.05
Сжать и восстановить БД


15-1137390936
begin...end
2006-01-16 08:55
2006.02.05
С Днём рождения! 16 января


2-1137706453
Vlad1
2006-01-20 00:34
2006.02.05
как в мое прог _часы сделать изменение сис времени


4-1133010656
Kerk
2005-11-26 16:10
2006.02.05
Unicode-версия LB_FINDSTRING





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский