Forum Coders' city Strona Główna Coders' city
Nasza pasja to programowanie!
 

 PomocPomoc   SzukajSzukaj   UżytkownicyUżytkownicy   GrupyGrupy  RejestracjaRejestracja 
Archiwum starego forum + teoria    RSS & Panel/SideBar
 ProfilProfil   Zaloguj się, by sprawdzić wiadomościZaloguj się, by sprawdzić wiadomości   ZalogujZaloguj 

Potrzebuję szybkiej odpowiedzi na moje pytanie... Zasady

Losowanie Liczb

Idź do strony 1, 2  Następny

 
Odpowiedz do tematu    Forum Coders' city Strona Główna -> Pole do popisu (beta testy)
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Adept
Gość





PostWysłany: Czw Gru 29, 2016 2:04 pm  OP    Temat postu: Losowanie Liczb Odpowiedz z cytatem Pisownia

Witajcie

Jeśli chciałbym napisać program gry w dużego lotka ? Niby prosta gra - tak ? Niemniej funkcja losująca ma to do siebie, że raz wylosowana liczba może się powtórzyć.

Czyli mogą zostać wylosowane następujące liczby:

7 13 21 30 40 21

liczba 21 została wylosowana dwa razy


O to rozwiązanie powyższego problemu


Kod:
program losowania_unikalnych_liczb;
uses crt;
type
tablica_losowanych_liczb = array[1..6] of integer;
var
losowe_liczby: tablica_losowanych_liczb;
i,j,pojemnik,max: integer;
begin
clrscr;
randomize;
writeln;
writeln(' Liczby wylosowane przez komputer:');
writeln;
for i := 1 to 6 do
begin
losowe_liczby[i] := random(6);
write(losowe_liczby[i]:4)
end;
writeln;
writeln;
writeln(' ---------------------------------');
writeln;
writeln(' Dzialanie algorytmu - wylosowane liczby maja sie nie powtarzac !!!');
writeln;
writeln;
i := 1;
while i <= 6 do
begin
for j := 1 to 6 do
if i <> j then
if losowe_liczby[i] = losowe_liczby[j] then
begin
pojemnik := random(6);
max := j;
while (j >= 1) do
begin
if losowe_liczby[j] = pojemnik then
begin
pojemnik := random(6);
j := max;
end
else
j := j - 1;

end;
losowe_liczby[max] := pojemnik;
end;
write(losowe_liczby[i]:4);
i := i + 1;
end;
writeln;
writeln;
writeln(' ---------------------------------');
readln;
end.


Jestem ciekaw waszych opinii w tym temacie. Za wszelkie sugestie bardzo dziękuję.
Powrót do góry
marcin_an
Site Admin


Dołączył: 26 Maj 2005
Posty: 18736

PostWysłany: Czw Gru 29, 2016 11:11 pm      Temat postu: Odpowiedz z cytatem Pisownia

Kod nie jest sformatowany, więc szkoda czasu na odgadywanie, co się w nim dzieje. I tyle komentarza możesz oczekiwać, jeśli nie zadbałeś o czytelność swojego kodu.

Nawet biorąc pod uwagę rozwlekłość Pascala*, szybki rzut oka sugeruje, że kod jest zbyt długi i zbyt głęboki, by reprezentował sensowne rozwiązanie omawianego problemu.Zwykła losowa permutacja elementów i wybranie 6 pierwszych liczb - i masz wynik.
____
* Czemu taki zabytek? Pascal był świetnym językiem dydaktycznym, ale przez prawie 50 lat od jego powstania wymyślono już trochę innych rzeczy - także takich, które mają również praktyczne zastosowanie. Np. Python, żeby nie szukać daleko.
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
Adept
Gość





PostWysłany: Pią Gru 30, 2016 12:04 am  OP(?)    Temat postu: Losowanie Liczb Odpowiedz z cytatem Pisownia

To prawda program jest napisany w Turbo Pascalu 7.0 a główny algorytm to:
Kod:
i := 1;
while i <= 6 do
         begin
               for j := 1 to 6 do
                  if i <> j then
                   if losowe_liczby[i] = losowe_liczby[j] then
                      begin
                             pojemnik := random(6);
                             max := j;
                             while (j >= 1) do
                                    begin
                                           if losowe_liczby[j] = pojemnik then
                                             begin
                                                    pojemnik := random(6);
                                                    j := max;
                                              end
                                           else
                                              j := j - 1;
                                    end;
                             losowe_liczby[max] := pojemnik;
                      end;
               write(losowe_liczby[i]:4);
               i := i + 1;
         end;

Obecnie tylko tyle potrafię i przepraszam, ze kogoś rozczarowałem.
Powrót do góry
Olo



Dołączył: 22 Sty 2010
Posty: 150

PostWysłany: Pią Gru 30, 2016 3:19 am      Temat postu: Odpowiedz z cytatem Pisownia

Pierwsza zasada totolotka (którą właśnie wymyśliłem wieczorową porą :-) brzmi:
do wylosowania 6. liczb potrzeba i wystarcza 6 losowań.
Kod:

   funkcyja losuj( n ) //losuje liczbę od 1 do n włącznie
  
   ilosc_liczb := 49
   Liczby := [1..49] //tablica zawierająca losowane liczby w dowolnej kolejności
  
   FOR j := 1 TO 6 (włącznie) DO
  
      //losujemy identyfikator w tabeli
      id_wylosowanej := losuj(ilosc_liczb)
      
      wylosowana := Liczby[id_wylosowanej]
      
      //można wydrukować lub zapisać
      print(wylosowana)
      
      //na miejsce wylosowanej trzeba wstawić ostatnią liczbę
      Liczby[id_wylosowanej] := Liczby[ilosc_liczb]
      
      //oraz zmiejszyć zakres do losowania
      ilosc_liczb := ilosc_liczb - 1
      j := j + 1
      
   END DO AND END TO AND END FOR



Metoda może również służyć do potasowania elementów tablicy jeśli 6 zamieni się na 49.
A przepraszać, doprawdy, nie masz powodu.

_________________
2 × 2 = 3,999999999997
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
marcin_an
Site Admin


Dołączył: 26 Maj 2005
Posty: 18736

PostWysłany: Pią Gru 30, 2016 8:06 am      Temat postu: Re: Losowanie Liczb Odpowiedz z cytatem Pisownia

Adept napisał:
Obecnie tylko tyle potrafię i przepraszam, ze kogoś rozczarowałem.
Za co przepraszasz? Skoro pytasz o opinię, dostajesz opinię :D.

Zastanów się, ile operacji - w najgorszym przypadku - wykona twój kod. Albo raczej: czy w ogóle się zakończy. To jest również odpowiedź na pytanie, dlaczego jest to złe podejście.
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
Adept
Gość





PostWysłany: Pią Gru 30, 2016 4:17 pm      Temat postu: Losowanie Liczb Odpowiedz z cytatem Pisownia

Mała optymalizacja algorytmu mająca na celu przyśpieszenie jego działania przez zmniejszenie iteracji w obu pętlach - for.

Kod:
{ początek algorytmu }
for i := 1 to 5 do { pętla while została zastąpiona pętlą fora }
     begin
            for j := i+1 to 6 do
                 begin
                       writeln(i,' ',j); { przebieg obrazowych iteracji w pętlach fora }
                       if losowe_liczby[i] = losowe_liczby[j] then
                         begin
                             pojemnik := random(6);
                             max := j;
                             l := max;
                             while (l >= 1) do
                                 begin
                                     if losowe_liczby[l] = pojemnik then
                                       begin
                                           pojemnik := random(6);
                                           l := max;
                                       end
                                     else
                                        l := l - 1;
                                 end;
                             losowe_liczby[max] := pojemnik;
                         end;
                       end;
                     writeln(' ',i,' = ',losowe_liczby[i]:4); { podgląd wartości poszczególnych elementów tablicy }  
                 end;
                { koniec algorytmu }
writeln;
write(' 6 = ',losowe_liczby[6]:4); { podgląd ostatniego elementu tablicy }


W Obecnej chwili chyba nie jestem w stanie tego lepiej napisać.

Na marginesie chciałbym się zapytać czy do nauki tworzenia algorytmów tych prostych i tych bardziej skomplikowanych wybór kompilatora ma znaczenie ?
Powrót do góry
marcin_an
Site Admin


Dołączył: 26 Maj 2005
Posty: 18736

PostWysłany: Pią Gru 30, 2016 11:02 pm      Temat postu: Re: Losowanie Liczb Odpowiedz z cytatem Pisownia

Adept napisał:
Mała optymalizacja algorytmu mająca na celu przyśpieszenie jego działania
Algorytmu, który w pesymistycznym przypadku będzie wisiał w nieskończoność. Przyspieszenie nieskończenie długiego czasu wykonywania to faktycznie potrzebna rzecz ;). I ja, i Olo podaliśmi ci już dwa rozwiązania tego zaganienia, które działają i są o wiele lepsze. Jakiego komentarza oczekujesz do powtórzenia jeszcze raz kodu, o którym zostało już napisane, że jest zły?

Adept napisał:
przez zmniejszenie iteracji w obu pętlach - for.
Chociaż plus za samo zauważenie możliwości optymalizacji. Co prawda klasa złożoności jest nadal taka sama, ale faktycznie - wykona o połowę mniej operacji.

Adept napisał:
Na marginesie chciałbym się zapytać czy do nauki tworzenia algorytmów tych prostych i tych bardziej skomplikowanych wybór kompilatora ma znaczenie ?
Kompilatora: nie.

Natomiast wybór języka - tak. Jeśli chcesz się uczyć AiSD, a to są sprawy abstrakcyjne, to warto użyć języka, który pozwala takie rzeczy wygodnie wyrazić, a nie babrać się w niuansach nieistotnych z punktu widzenia algorytmiki. Oczywiście je też - jako programista - będziesz musiał poznać. Ba! Będziesz musiał je znać, żeby zrozumieć działanie algorytmów w realnych środowiskach. Ale to inna para kaloszy.
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
Adept
Gość





PostWysłany: Sob Gru 31, 2016 12:21 am      Temat postu: Losowanie Liczb Odpowiedz z cytatem Pisownia

Cytat:
Algorytmu, który w pesymistycznym przypadku będzie wisiał w nieskończoność. Przyspieszenie nieskończenie długiego czasu wykonywania to faktycznie potrzebna rzecz ;)


Oba wersje może są złe ale jak testowałem to jedna i druga działa prawidłowo to znaczy pętle się kończą a nie ciągną się w nieskończoności a program wyświetla prawidłowe wyniki :) w obu przypadkach.

Niemniej w pierwszym przypadku zdarzają się puste przebiegi pętli for - zaś optymalizacja je całkowicie pomija. Oba wersje przetestowałem kilka razy i różnice w iteracjach widać. Natomiast nie zmienia to faktu, że oba wersje programów wyprowadzają prawidłowe wyniki, czas pracy obu algorytmów dla ludzkiego oka jest niezauważalny. Różnice pokazują tylko wartości zmiennych śledzący dany algorytm :).
Powrót do góry
marcin_an
Site Admin


Dołączył: 26 Maj 2005
Posty: 18736

PostWysłany: Sob Gru 31, 2016 5:29 am      Temat postu: Odpowiedz z cytatem Pisownia

"Sprawdziłem i działa" to jeden z najgorszych argumentów za prawidłowością programu. To, że przetestowałeś, nie oznacza nic. Zobacz, co program robi i czy ma jakąkolwiek gwarancję, że kiedykolwiek się zatrzyma. Nie ma. A jeszcze nie poruszyliśmy kwestii jakości rozkładu losowanych danych, żeby cię nie męczyć :>.

Policz też, ile razy co się wykonuje dla różnych rozmiarów danych wejściowcyh w zakresie np. od 10 elementów do miliarda elementów. Widzisz teraz różnicę? Narysuj sobie wykres, obrazujący te wyniki - to może być o wiele ciekawsze zadanie programistyczne niż samo losowanie. Możesz nawet narysować sobie czasy wykonania algorytmu dla różnych rozmiarów danych wejściowych, ale to jest zadanie trochę trudniejsze niż się wydaje na pierwszy rzut oka - szczególnie w czasach, w których procedury optymalizujące program mogą zdziałać cuda, a czas wykonania dla jakichkolwiek ręcznie weryfikowalnych danych jest zbyt mały, by dał się zmierzyć.
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
samolot



Dołączył: 26 Sty 2006
Posty: 8008
Skąd: Toruń

PostWysłany: Sob Gru 31, 2016 12:28 pm      Temat postu: Odpowiedz z cytatem Pisownia

Dodam na marginesie, że słowo 'wersja" w języku polskim ma rodzaj żeński, a więc jeśli są dwie, to "obie", a nie "oba", chyba, że ja nie nadążam za zmianami języka :)
_________________
Nie zadawaj bezcelowych pytań / Windows 8.1 / Windows 10 / VB2008 / VB 2010 / VB 2012 / Pisz poprawnie
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość Wyślij email
Wyświetl posty z ostatnich:   
Odpowiedz do tematu    Forum Coders' city Strona Główna -> Pole do popisu (beta testy) Wszystkie czasy w strefie CET (Europa)
Idź do strony 1, 2  Następny
Strona 1 z 2

 
Skocz do:  
Możesz pisać nowe tematy
Możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Możesz dodawać załączniki na tym forum
Możesz pobierać pliki z tego forum




Debug: strone wygenerowano w 0.04824 sekund, zapytan = 11
contact

| Darmowe programy i porady Jelcyna | Tansze zakupy w Helionie | MS Office Blog |