logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[Pascal] Jak w Pascalu przypisać tablicy unikalne losowe liczby?

Siber 22 Wrz 2004 18:02 4304 13
REKLAMA
  • #1 868143
    Siber
    Poziom 11  
    Posty: 38
    Ocena: 1
    Chodzi o pascala:
    Czy jest sposób (oczywiście szybki) na przypisanie wszystkim elementom tablicy losowej liczby tak, aby te liczby się nie powtarzały?
    Proszę o kod źródłowy... :roll:

    Zamykam. - arnoldziq
  • REKLAMA
  • #2 868318
    elektryk
    Poziom 42  
    Posty: 11029
    Pomógł: 439
    Ocena: 240
    Funkcja random sama w sobie jest powtarzalna, trzeba tylko przypisać stałą wartość do zmiennej RandSeed.
  • REKLAMA
  • #3 870413
    Siber
    Poziom 11  
    Posty: 38
    Ocena: 1
    to mi nic nie mówi, możesz napisać fragment kodu źródłowego?
  • #4 870494
    elektryk
    Poziom 42  
    Posty: 11029
    Pomógł: 439
    Ocena: 240
    Siber napisał:
    to mi nic nie mówi, możesz napisać fragment kodu źródłowego?
    A zaglądałeś do helpa?
  • REKLAMA
  • #5 870548
    Xitami
    Poziom 29  
    Posty: 1130
    Pomógł: 118
    Ocena: 31
    Kolego Elektryku w helpie nie będzie odpowiedzi na to pytanie.
    Siber, już raz odpowiedziałem, ale mój post został przeniesiony do kosza (napisałem "przeczytaj inne posty"), a szkoda, bo w momecie kiedy go pisałem, odpowiedź na twoje pytanie była cztery posty dalej i teraz jest obok (nie wiem jak wstawić link bezpośredni wskazujący topic) jest tam nawet źródło w pascalu (które nie podoba mi się)
    "losowanie czterech liczb bez powtórzeń"
  • REKLAMA
  • #7 870626
    Xitami
    Poziom 29  
    Posty: 1130
    Pomógł: 118
    Ocena: 31
    low, high, fiu fiu, otwarte tablice, ale przeczytałbym dokładnie pytanie, a poza tem, to:
    coś=X
    a "X"? to już jest generator "pseudo"losowy
  • #8 870691
    elektryk
    Poziom 42  
    Posty: 11029
    Pomógł: 439
    Ocena: 240
    xitami napisał:
    Kolego Elektryku w helpie nie będzie odpowiedzi na to pytanie.
    Ups, pierwszy post przeczytałem, że chodzi o to żeby się powtarzały, mea culpa.
  • #9 873923
    Siber
    Poziom 11  
    Posty: 38
    Ocena: 1
    Panie And!(roidzie)
    np. mam tablicę tab[1..100] of integer;
    druga linijka ma wyglądać tak: for i=low(tab) to ....
    po i nie powinno być przypisańia ":=" ? low i high to zmienne którym mam sam określić wartości?
  • #10 873938
    Xitami
    Poziom 29  
    Posty: 1130
    Pomógł: 118
    Ocena: 31
    Ostrzegam, fragment kodu kolegi And nie jest odpowiedzią na twoje pytanie.
  • #11 873963
    lelekx
    Poziom 30  
    Posty: 1220
    Pomógł: 158
    Ocena: 90
    
    const tabl_low = 1;
    const tabl_high = 10;
    const rand_high = 100;
    
    var tabl : array [tabl_low..tabl_high] of integer;
    var counter : integer;
        subcounter : integer;
        randvalue : integer;
    
    begin
      randomize;
      for counter := tabl_low to tabl_high do
       begin
        repeat
         randvalue := random(rand_high);
         for subcounter := tabl_low to counter-1 do
          if tabl[subcounter]=randvalue then
          begin
           randvalue := -1;
           break;
          end;
        until randvalue <> -1;
        tabl[counter]:=randvalue;
       end;
    
    
    end.


    Przepraszam za niekonsekwencję, program wklepałem w 5 minut i na szybko go upiększałem :)
    Ale grunt że działa (nie ważne jak wolno).
    Co do GOTO - nie cofajmy się do epoki Basica - nie dałbym rozgrzeszenia nawet w programie składającym się z 3 linijek.


    A co do pierwszego zarzutu to proszę:
    
    const tabl_low = 1;
    const tabl_high = 10;
    const rand_low = 0;
    const rand_high = 100;
    
    var tabl : array [tabl_low..tabl_high] of integer;
    var counter : integer;
        subcounter : integer;
        randvalue : integer;
        rand_ok : boolean;
    
    begin
      randomize;
      for counter := tabl_low to tabl_high do
       begin
        repeat
         randvalue := random(rand_high+1)-rand_low;
         rand_ok := true;
         for subcounter := tabl_low to counter-1 do
          if tabl[subcounter]=randvalue then
          begin
           rand_ok := false;
           break;
          end;
        until rand_ok;
        tabl[counter]:=randvalue;
       end;
    
    
    end.
  • #12 873991
    Xitami
    Poziom 29  
    Posty: 1130
    Pomógł: 118
    Ocena: 31
    ale ja zrzęda jestem, do wszystkiego muszę się przyczepić (szczególnie kiedy na czymś się znam)
    O!!!! jest pierwszy (w dwu wątkach o tym samym) kawałek kodu który robi to co ma robić, choćiaż ;)
    to -1 "magiczna liczba" a co jeśli chcemy losować także ujemne liczby? lepiej już BREAK (szkoda że nie zadziała - przy tak napisanych pętelkach dam rozgrzeszenie za GOTO).
    pierwszą linijkę przestawiłbym o dwa wiersze niżej i napisał tabl: array[tab_low..tab_hi] of.......
    no bo do tego właśnie służą deklaracje stałych, a Ty bardzo NIEkonsekwentnie z tego korzystasz.
    -----------------------------
    Lelex: no już jest cacy ;)
    1: wybaczone
    2: działa ale przy dodatkowych założeniach
    3: nie zgadzam się, GOTO czasem strasznie uprasza życie i podnosi czytelność (bardzo rzadko)
  • #13 874357
    Siber
    Poziom 11  
    Posty: 38
    Ocena: 1
    do czego służy słowo "break"? jest pod koniec programu
  • #14 874365
    Xitami
    Poziom 29  
    Posty: 1130
    Pomógł: 118
    Ocena: 31
    tu break zrywa pętlę FOR, ale zrywa też REPEAT i WHILE

Podsumowanie tematu

✨ Dyskusja dotyczy sposobu przypisania tablicy w Pascalu unikalnych, losowych liczb bez powtórzeń. Podkreślono, że standardowa funkcja random generuje liczby pseudolosowe, a wartość RandSeed należy ustawić, by zmieniać sekwencję losowań. Zaproponowano rozwiązanie polegające na iteracyjnym losowaniu liczby i sprawdzaniu, czy nie występuje już w tablicy, z użyciem pętli repeat oraz instrukcji break do przerywania pętli for w przypadku wykrycia duplikatu. Przykładowy kod definiuje zakres indeksów tablicy i zakres losowanych liczb, wykorzystuje randomize do inicjalizacji generatora oraz pętle do przypisania unikalnych wartości. Omówiono także znaczenie słów kluczowych low, high, break oraz kwestie stylistyczne dotyczące użycia GOTO i organizacji kodu. Wskazano, że metoda jest działająca, choć może nie być optymalnie szybka, ale spełnia wymóg unikalności losowych liczb w tablicy.
Wygenerowane przez model językowy.
REKLAMA