Tablica Dynamiczna i dowolne liczby

0

w jaki sposob wypelnic zalozmy tablice 100 elementowa liczbami od 1-100 totalnie losowo i tak, aby sie zadna nie powtarzala ? :)

0

Wypełniasz po kolei liczbami. Tasujesz. Masz.

0

No jeśli ma być dokładnie losowo to trzeba by zadbać o odpowiednie to "tasowanie". Mnie sie wydaje, że szybciej i w 100% losowo jest tak:

 var a,b:array[1..100]of byte;
i,l:byte;
begin for i:=1 to 100 do a[i]:=i;
randomize;
for i:=1 to 100 do begin  l:=random[100-i+1]+1; 
                                    b[i]:=a[l];
                                    if l<100 then move[a[l+1],a[l],100-l);//to mozna zrobic w pętli for ale move jest szybsze
                                                                       //szczególnie jesli elementów byłoby duzo wiecej niż 100
                   end;
// w tablicy b są losowe elementy bez powtorzen od 1 do 100

0
FOR i := 1 TO 100 DO Tab[i] := 1;

VAR  Temp :Byte;

BEGIN
 FOR i := Random(200) DOWNTO -99 DO
  FOR j := Random(100)+1 DOWNTO 1 DO
   BEGIN
    Temp := Tab[j];
    Tab[j] := Tab[1];
    Tab[1] := Temp;
   END;

Nie wiem co Ci będzie łatwiej zakodować moją czy Marmara. To samo nie wiem co jest szybsze. Pewnie Marmara

0

Marmar bylo pare drobnych bledow... problem mam tylko z

move[a[l+1],a[l],100-l];

bo mam blad Not enough actual parameters i nie wiem co mam wklepac tutaj... nie mialem wczesniej lacznosci z move Prosil bym o pomoc :)

0

??

0

Tak trudno help uruchomić, i zobaczyć, jakich parametrów wymaga move??! Albo nacisnąć Ctrl+Shift+Spacja?!

0

Wiem, ze sa 3 parametry... z jakiej tablicy do jakiej tablicy i ile elementow... niestety nie wiem co akurat w tym przypadku tutaj nie pasuje...

0

dobra mam zrobilem..

0

zrobilem, aby dzialalo, ale jak to chce przezucic na tablice dynamiczne to sie totalnie sypieee... w tablicy wymieszanej jest z 8 liczb powielonych wielokrotnie... dlaczego ? jak to zrobic ?

0
  1. Pokaż kod.

  2. Zarejestruj się i zacznij edytować posty.

0
Oleksy_Adam napisał(a)
FOR i := 1 TO 100 DO Tab[i] := 1;
VAR  Temp :Byte;

BEGIN
 FOR i := Random(200) DOWNTO -99 DO
  FOR j := Random(100)+1 DOWNTO 1 DO
   BEGIN
    Temp := Tab[j];
    Tab[j] := Tab[1];
    Tab[1] := Temp;
   END;

Nie wiem co Ci będzie łatwiej zakodować moją czy Marmara. To samo nie wiem co jest szybsze. Pewnie Marmara

Po pierwsze to chyba

FOR i := 1 TO 100 DO Tab[i] := i {a nie 1};

Po drugie to sposób, który przedstawiłem daję 100% losowy rozkład (z dokładnością do losowości wbudowanego generatora random) natomiast z tego co rozumiem to TY OLEKSY_ADAM po prostu zamieniasz miejscami iles tam razy jakies elementy. Daję Ci 100% gwarancję, że w ten sposób NIE uzyskasz pełnej losowości rozkładu nawet gdyby Twoją metodę poprawić następująco:

BEGIN
 FOR i := Random(2000000) DOWNTO -99 DO
    BEGIN
        j := Random(100)+1   
    Temp := Tab[j];
    Tab[j] := Tab[1];
    Tab[1] := Temp;
   END;
END;

Powyższy kod jest już lepszy ale i tak nie w 100% losowy, ponadto o wiele "droższy" czasowo.

Jeśli zrobiłem jakieś błedy teraz czy poprzednio to przepraszam , starałem się by ich nie było. A co do standardowj funkcji move (do Damiana997) to użyłem jej prawidłowo. Jeśli kompilator wskazał Ci złą listę parametrów oznacza to że w którymś module w uses albo w kodzie programu została zdefiniowana inna funkcja o tej samej nazwie move i stąd ten problem.

Jeszcze słowo do Damiana997: Jesli cos nie gra przy tablicach dynamicznych to:

  1. pamietaj ze tam się zawsze indeksuje od 0 a nie od 1
  2. jesli zmienisz typ z byte na integer to musisz tez w funkcji move trzeci parametr mnozyc przes 4 albo szybciej shl 2.
  3. Jesli dalej nie działa to pokaż kod.
0

Daję Ci 100% gwarancję, że w ten sposób NIE uzyskasz pełnej losowości rozkładu nawet [...]

Cholera... a ja zawsze stosowałem w Monte Carlo i algorytmach ewolucyjnych (fakt, raczej w prostych zagadnieniach) metodę Adamo-podobną, i mi zawsze działało. Powiem więcej, nawet mi ładne statystyki rozkładu wychodziły. Nigdy nie gorsze od tych, jakie miał "bazowy" generator liczb. No nie wiem... ale ja w końcu nigdy w poważniejszych obliczeniach nie używam standardowego rand - może stąd to się bierze :]

Co to znaczy: 100% losowy rozkład?

Nigdy z takim pojęciem się nie spotkałem. Przy generatorach najważniejszymi parametrami jest długość okresu i równomierność rozkładu. Jest parę innych cech, ale nigdy nie spotkałem się z krytyką z serii: ten ciąg jest losowy tylko w 43%.

0

Oczywiście jest to określenie umowne. Jeśli mówię w 100% losowy albo nie to nie znaczy, że definiuję losowość dla każdej liczby procent :) A co znaczy w 100% losowy? to znaczy (w tym konkretnym przypadku) taki w którym każda permutacja jest jednakowo prawdopodobna z prawdopodobieństwem 1/100!. (! = silnia)
Zgadzam się, że w wielu zastosowaniach nie jest niezbędna ta "jednostajność" rozkładu, czyli jego pełna losowość czyli nie preferowanie jednego zdarzenia kosztem innego. Nie mniej jednak jesli coś można zrobić dobrze to dlaczego zadowalać sie niedoskonałymi rozwiązaniami typu permutowanie ileś razy losowo wybranych elementów? :)

Zakłądam przy tym, że wszystko co robię jest na tyle "dobre" na ile "dobre" sa generatory standardowe, których używam czyli random, random(n). Dobre znaczy na ile jednostajnie losują to co mają losować, nie wnikam w kwestię okresu generatora bo to inny temat. Polecam książkę panów R.Wieczorkowski i R. Zieliński pt "komputerowe genratory liczb losowych". To książka matematyczna w tym sensie, że jesli mówi się że tworzymy generator dający jakiś rozkład to on ma dawać taki rozkład a nie jakiś zbliżony. Tym też kierowałem się pisząc posty w tym wątku. Książkę naprawde polecam , jest cienka i bardzo konkretna. Mogę jeszcze dodać, że jest wskazywana jako jedna z podstawowych na Wydziale Matematyki Informatyki i Mechaniki Uniwersytetu Warszawskiego na wykładach związanych z ta problematyką (między innymi na metodach monte carlo)

0

A aż sobie rzucę okiem, dzięki za tytuł. Tzn. rzucę okiem jak znajdę w bibliotece ;)

0
var
Tas:array of integer;
Tablica:array of integer;
begin
setlength(Tas,100);
setlength(Tablica,100);

a:=length(Tablica);


for i:=1 to a do begin  l:=random(a-i+1)+1;
          Tablica[i-1]:=Tas[l];
          if l<a then move(Tas[l+1],Tas[l],a-l);
        end;

Kodzik tak wyglada i Tablica z wynikiem(Tas) nie wychodzi jak powinna..</delphi>

0
var Tas:array of integer;
Tablica:array of integer;
a,i,l:integer;
begin   a:=100;
setlength(Tas,a);
setlength(Tablica,a);
for i:=0 to a-1 do tablica[i]:=i+1;// przypisujemy po kolei liczby od 1 do 100
for i:=0 to a-1 do begin  l:=random(a-i);
          Tas[i]:=Tablica[l];
          if l<a-1 then move(Tablica[l+1],Tablica[l],(a-l-1-i)shl 2);// przecież pisałem że trzeba trzeci parametr move zmodyfikować. Tu jeszcze dodałem -i w stosunku do poprzedniego kodu ponieważ nie trzeba kopiowac tablicy do końca , wystrarczy te elementy, które  jeszcze nie były wzięte pod uwagę.
                  end;
end;

Wynikiem jest tablica Tas.

1 użytkowników online, w tym zalogowanych: 0, gości: 1