Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.11.12;
Скачать: CL | DM;

Вниз

Оптимизация кода   Найти похожие ветки 

 
---------   (2006-10-26 23:40) [0]

Люди помогите!!!!! Как мне это лучше сделать, чтоб машина не гнала бесу..тормозит по чёрному!!!!

вот код:

procedure TForm1.rasbr;
var
 c_e: array [0..15] of Integer;
 x, xx: Integer;
 zxc: Boolean;
begin
for xx := 0 to 15 do
   begin
   zxc := False;
   Randomize;
   x := Random(15);
   repeat
     if xx=0 then
      begin
        c_e[xx] := x;
        zxc := True;
        end;
     if xx=1 then
        if c_e[0]<>x then
           begin
           c_e[xx] := x;
           zxc := True;
           Beep;
           end else
               begin
               Randomize;
               x := Random(15);
               zxc := False;
               end;
     if xx=2 then
        if (c_e[0]<>x)and(c_e[1]<>x) then
           begin
           c_e[xx] := x;
           zxc := True;
           Beep;
           end else
               begin
               Randomize;
               x := Random(15);
               zxc := False;
               end;
     if xx=3 then
        if (c_e[0]<>x)and(c_e[1]<>x)and(c_e[2]<>x) then
           begin
           c_e[xx] := x;
           zxc := True;
           Beep;
           end else
               begin
               Randomize;
               x := Random(15);
               zxc := False;
               end;
     if xx=4 then
        if (c_e[0]<>x)and(c_e[1]<>x)and(c_e[2]<>x)and(c_e[3]<>x) then
           begin
           c_e[xx] := x;
           zxc := True;
           Beep;
           end else
               begin
               Randomize;
               x := Random(15);
               zxc := False;
               end;
     if xx=5 then
        if (c_e[0]<>x)and(c_e[1]<>x)and(c_e[2]<>x)and(c_e[3]<>x)
           and(c_e[4]<>x) then
           begin
           c_e[xx] := x;
           zxc := True;
           Beep;
           end else
               begin
               Randomize;
               x := Random(15);
               zxc := False;
               end;
     if xx=6 then
        if (c_e[0]<>x)and(c_e[1]<>x)and(c_e[2]<>x)and(c_e[3]<>x)
           and(c_e[4]<>x)and(c_e[5]<>x) then
           begin
           c_e[xx] := x;
           zxc := True;
           Beep;
           end else
               begin
               Randomize;
               x := Random(15);
               zxc := False;
               end;
     if xx=7 then
        if (c_e[0]<>x)and(c_e[1]<>x)and(c_e[2]<>x)and(c_e[3]<>x)
           and(c_e[4]<>x)and(c_e[5]<>x)and(c_e[6]<>x) then
           begin
           c_e[xx] := x;
           zxc := True;
           Beep;
           end else
               begin
               Randomize;
               x := Random(15);
               zxc := False;
               end;
     if xx=8 then
        if (c_e[0]<>x)and(c_e[1]<>x)and(c_e[2]<>x)and(c_e[3]<>x)
           and(c_e[4]<>x)and(c_e[5]<>x)and(c_e[6]<>x)and(c_e[7]<>x) then
           begin
           c_e[xx] := x;
           zxc := True;
           Beep;
           end else
               begin
               Randomize;
               x := Random(15);
               zxc := False;
               end;
     if xx=9 then
        if (c_e[0]<>x)and(c_e[1]<>x)and(c_e[2]<>x)and(c_e[3]<>x)
           and(c_e[4]<>x)and(c_e[5]<>x)and(c_e[6]<>x)and(c_e[7]<>x)
           and(c_e[8]<>x) then
           begin
           c_e[xx] := x;
           zxc := True;
           Beep;
           end else
               begin
               Randomize;
               x := Random(15);
               zxc := False;
               end;
     if xx=10 then
        if (c_e[0]<>x)and(c_e[1]<>x)and(c_e[2]<>x)and(c_e[3]<>x)
           and(c_e[4]<>x)and(c_e[5]<>x)and(c_e[6]<>x)and(c_e[7]<>x)
           and(c_e[8]<>x)and(c_e[9]<>x) then
           begin
           c_e[xx] := x;
           zxc := True;
           Beep;
           end else
               begin
               Randomize;
               x := Random(15);
               zxc := False;
               end;
     if xx=11 then
        if (c_e[0]<>x)and(c_e[1]<>x)and(c_e[2]<>x)and(c_e[3]<>x)
           and(c_e[4]<>x)and(c_e[5]<>x)and(c_e[6]<>x)and(c_e[7]<>x)
           and(c_e[8]<>x)and(c_e[9]<>x)and(c_e[10]<>x) then
           begin
           c_e[xx] := x;
           zxc := True;
           Beep;
           end else
               begin
               Randomize;
               x := Random(15);
               zxc := False;
               end;
     if xx=12 then
        if (c_e[0]<>x)and(c_e[1]<>x)and(c_e[2]<>x)and(c_e[3]<>x)
           and(c_e[4]<>x)and(c_e[5]<>x)and(c_e[6]<>x)and(c_e[7]<>x)
           and(c_e[8]<>x)and(c_e[9]<>x)and(c_e[10]<>x)and(c_e[11]<>x) then
           begin
           c_e[xx] := x;
           zxc := True;
           Beep;
           end else
               begin
               Randomize;
               x := Random(15);
               zxc := False;
               end;
     if xx=13 then
        if (c_e[0]<>x)and(c_e[1]<>x)and(c_e[2]<>x)and(c_e[3]<>x)
           and(c_e[4]<>x)and(c_e[5]<>x)and(c_e[6]<>x)and(c_e[7]<>x)
           and(c_e[8]<>x)and(c_e[9]<>x)and(c_e[10]<>x)and(c_e[11]<>x)
           and(c_e[12]<>x) then
           begin
           c_e[xx] := x;
           zxc := True;
           Beep;
           end else
               begin
               Randomize;
               x := Random(15);
               zxc := False;
               end;
     if xx=14 then
        if (c_e[0]<>x)and(c_e[1]<>x)and(c_e[2]<>x)and(c_e[3]<>x)
           and(c_e[4]<>x)and(c_e[5]<>x)and(c_e[6]<>x)and(c_e[7]<>x)
           and(c_e[8]<>x)and(c_e[9]<>x)and(c_e[10]<>x)and(c_e[11]<>x)
           and(c_e[12]<>x)and(c_e[13]<>x) then
           begin
           c_e[xx] := x;
           zxc := True;
           Beep;
           end else
               begin
               Randomize;
               x := Random(15);
               zxc := False;
               end;
     if xx=15 then
        if (c_e[0]<>x)and(c_e[1]<>x)and(c_e[2]<>x)and(c_e[3]<>x)
           and(c_e[4]<>x)and(c_e[5]<>x)and(c_e[6]<>x)and(c_e[7]<>x)
           and(c_e[8]<>x)and(c_e[9]<>x)and(c_e[10]<>x)and(c_e[11]<>x)
           and(c_e[12]<>x)and(c_e[13]<>x)and(c_e[14]<>x) then
           begin
           c_e[xx] := x;
           zxc := True;
           Beep;
           end else
               begin
               Randomize;
               x := Random(15);
               zxc := False;
               end;
   until zxc = True;
   end;
end;


 
Ketmar ©   (2006-10-26 23:48) [1]

лучше всего или провести ритуал посвящения машины Сатане (тогда машина не будет бесов бояться), или не вызывать бесов без достаточного опыта в саммонинге.


 
Anatoly Podgoretsky ©   (2006-10-26 23:51) [2]

Много буков, что бы разбираться, а какая часть тормозит, померь и скажи нам, тогда поможем.

Кстати ты слышал, что Паскаль (Дельфи) поддерживают оператор CASE?


 
DrPass ©   (2006-10-26 23:51) [3]

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


 
DrPass ©   (2006-10-26 23:52) [4]


> Мастером

= Мастеров. Руки дрожат и плохо слушаются


 
Anatoly Podgoretsky ©   (2006-10-26 23:53) [5]

Не это черный сотона или ССЗБ или что еще хуже, даже называть не хочется.


 
------------   (2006-10-26 23:55) [6]

1ое число есть а дальше он так думать начинает


 
Anatoly Podgoretsky ©   (2006-10-26 23:57) [7]

Обязательно дождись второго.


 
Kolan ©   (2006-10-27 00:00) [8]

> Как мне это лучше сделать

Выделить все и удалить.


 
------------   (2006-10-27 00:03) [9]

2го просто не дождёшся..мне нужно сгенерировать 16 чисел в разброс так, чтоб они не повторялись


 
Ketmar ©   (2006-10-27 00:04) [10]

а-а-а! я осилил код! кто догадался, для чего он? без анализа? интуитивно? нет, в цитатник, однозначно. только жаль, что всего 16 чисел надо. лучше бы 256. или 1024.


 
Ketmar ©   (2006-10-27 00:05) [11]

тьфу. автор разрушил всю интригу... %-(((


 
ProgRAMmer Dimonych ©   (2006-10-27 00:06) [12]

if (c_e[0]<>x)and(c_e[1]<>x)and(c_e[2]<>x)and(c_e[3]<>x)
          and(c_e[4]<>x)and(c_e[5]<>x)and(c_e[6]<>x)and(c_e[7]<>x)
          and(c_e[8]<>x)and(c_e[9]<>x)and(c_e[10]<>x)and(c_e[11]<>x)
          and(c_e[12]<>x)and(c_e[13]<>x) then

Я бы эту проверку в отдельную функцию вынес:

function IsAllFalse(Count,x:Integer):Boolean;
var
i:Integer;
begin
Result:=True;
for i:=0 to Count-1 do
 if c_e[i]=x then
  Result:=False;
end;


 
Ketmar ©   (2006-10-27 00:06) [13]

ах, да. +1 за трудолюбивость. -16384 за сам код.


 
Ketmar ©   (2006-10-27 00:07) [14]

>[12] ProgRAMmer Dimonych(c) 27-Oct-2006, 00:06
>Я бы эту проверку в отдельную функцию вынес:
нафига?


 
ProgRAMmer Dimonych ©   (2006-10-27 00:08) [15]

> [14]
Действительно... (С) Староконь


 
DrPass ©   (2006-10-27 00:10) [16]


> Ketmar ©   (27.10.06 00:04) [10]

У этого кода еще вторая функция есть - ускорить приход Антихриста


 
Gero ©   (2006-10-27 00:12) [17]

Жесть!


 
ProgRAMmer Dimonych ©   (2006-10-27 00:12) [18]

Вообще, чего-то у меня с идеями туговато...

Вариант такой: заполняем массив числами, равными номерам элементов, т.е.

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

В цикле...

Дальше начинаем случайно выбирать элемент и менять его местами со случайно выбранным другим.

Пока лучше ничего в голову не пришло :(


 
Anatoly Podgoretsky ©   (2006-10-27 00:13) [19]

И 2^64 за остальное.


 
DrPass ©   (2006-10-27 00:16) [20]


> ------------   (27.10.06 00:03) [9]

Это понятно... Но какова задумка, блин...
Ладно, не мучайся
randomize;
for i:= 0 to 15 do c_e[i]:= -1; //функцией fillchar пугать тебя не будем
k:= 0;
for i:= 0 to 15 do
begin
 j:= random(16) + 1;//сколько - не особо важно, лишь бы случайно
 repeat
   if k = 15 then k:= 0 else k:= k + 1;
   if c_e[k] = -1 then j:= j - 1;
 until j = 0;
 c_e[k]:= i;
end;


 
------------   (2006-10-27 00:16) [21]

ProgRAMmer Dimonych  вариант...


 
Gero ©   (2006-10-27 00:18) [22]

А вобще парень без комплексов. Я бы такой код постеснялся кому-то показывать.


 
DrPass ©   (2006-10-27 00:20) [23]

Удалено модератором


 
------------   (2006-10-27 00:20) [24]

Удалено модератором


 
Ketmar ©   (2006-10-27 00:26) [25]

>[16] DrPass(c) 27-Oct-2006, 00:10
>У этого кода еще вторая функция есть - ускорить приход
>Антихриста
тс-с-с! это тайна!

>[18] ProgRAMmer Dimonych(c) 27-Oct-2006, 00:12
>Вообще, чего-то у меня с идеями туговато...
отчего же "туговато"? очень верный подход. часто зовётся "задача о перемешивании колоды карт". решается в том числе и таким путём. так что если сам придумал -- радуйся. %-)


 
DrPass ©   (2006-10-27 00:28) [26]

Удалено модератором


 
------------   (2006-10-27 00:32) [27]

спасибо всё пашет!!!!!!!!!!!1    :):):):)


 
Don Nikola ©   (2006-10-27 06:26) [28]

>мне нужно сгенерировать 16 чисел в разброс так, чтоб они не повторялись

Имею вопрос не очень по теме, но сходной тематики.
Есть код вида:
---
add ax,45 //числа колдунские
rol ax,1 //числа колдунские
xor ax,2927 //числа колдунские
---
Так вот, такой код выдает последовательность из 65536 неповторяющихся значений, то есть перебирает все возможные варианты, причем выглядит результат весьма рендомно. Правильных колдунских чисел не очень много, но хватает.
Собственно вопрос: как найти эти числа для 32бит? Для 8/16 это не проблема, немного оптимизированный брутфорс и все находится. Что это вообще за метод рендома, может он давно известен?


 
ASoft   (2006-10-27 07:55) [29]

кто-нить скажет, для чего у автора сабжа в приведенном листинге постоянно вызывается Randomize? Кажись, достаточно в onCreate один раз ето вызвать.... Или я чего-то не знаю, касаемо этого?


 
Megabyte ©   (2006-10-27 12:12) [30]

<offtop>В орешник код будет отправлен?</offtop>


 
Loginov Dmitry ©   (2006-10-27 12:53) [31]

> кто-нить скажет, для чего у автора сабжа в приведенном листинге
> постоянно вызывается Randomize?


Это чтоб исключить фактор псевдо-случайности, который обычно проявляется при использовании Random %))


 
Krants   (2006-10-27 13:06) [32]

Я понял!, проблема даже не в коде, это все из-за процедуры Beep!!! поменяй динамик, должно помочь! Серьезно!


 
ASoft   (2006-10-27 13:23) [33]

фактор псевдо-случайности
первый раз слышу... ;)


 
DevilDevil ©   (2006-10-27 16:30) [34]

предлагаю не самый быстрый, но вполне понятный и компактный способ:

const
  COUNT = 16;

procedure TForm1.rasbr;
var
c_e: array [0..COUNT-1] of Integer;
c_b: array [0..COUNT-1] of boolean;
X, i : integer;
begin
  Randomize;
  ZeroMemory(c_b, COUNT);

  for i := 0 to COUNT-1 do
  repeat
      X := random(COUNT);

      if not c_b then
         begin
            c_e[i]  := X;
            c_b[X] := true;
            break;
         end;

  until false;
end;


 
DevilDevil ©   (2006-10-27 16:32) [35]

... if not c_b[X] then ...


 
Gydvin ©   (2006-10-27 19:29) [36]

Ну я тож попробую свой вариант выкинуть, как-то делал.

Сколько угодно цифр (edit1)

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;

type
 TForm1 = class(TForm)
   Button1: TButton;
   Edit1: TEdit;
   Memo1: TMemo;
   procedure Button1Click(Sender: TObject);
 private
{ Private declarations }

 public
{ Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
 function prov(var r: array of integer; num, i: integer): boolean; /// i?iaa?ea ia iiaoi?
 var
   x, a: integer;
 begin
   result := false;
   for x := 0 to i - 1 do
     if r[x] = num then begin
       result := true;
       exit;
     end;
 end;
var
 r: array of integer;
 x, i, a: integer;
begin
 try
   i := Strtoint(edit1.Text) + 1;
 except
   Showmessage("Error integer");
 end;
 setlength(r, i);

 randomize;
/// generate

 for x := 0 to i - 1 do begin
   a := random(i);
   while (prov(r, a, x)) do a := random(i);
   r[x] := a;
 end;

///write
 memo1.Clear;
 for x := 0 to i - 1 do memo1.Lines.Add(inttostr(r[x]))
end;

end.



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

Текущий архив: 2006.11.12;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.031 c
2-1161841281
XTD
2006-10-26 09:41
2006.11.12
Посоветуйте хорошую компоненту по работе с *.DBF базами.


2-1161842761
_Mouse_
2006-10-26 10:06
2006.11.12
Как скопировать в клипбоард?


15-1161607601
Vitality
2006-10-23 16:46
2006.11.12
Работа с таблицей Exel


3-1158317143
Sergey_b
2006-09-15 14:45
2006.11.12
выбор данных, в соответствии с иерархией


15-1161580480
Бугага
2006-10-23 09:14
2006.11.12
В мире есть 10 категорий людей: те, кто знает двоичное исчисление