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

Jak napisać symulator LOTTO do losowania liczb bez powtórzeń?

24 Wrz 2004 23:58 24841 15
REKLAMA
  • #1 873272
    Konto nie istnieje
    Konto nie istnieje  
  • REKLAMA
  • #2 873462
    Xitami
    Poziom 29  
    Posty: 1130
    Pomógł: 118
    Ocena: 31
    Taaa, ciekawym jak można dać szczegółową odpowiedź na tak postawione pytanie.
    Może tak, kiedyś PC dostawało się z DOSem, a w nim był BASIC, teraz już tak nie jest.
    Jeśli chcesz zacząć przygodę z programowaniem to idź do księgarni, i tu już problem, na co się zdecydować? do wyboru do koloru, języków chyba ze sto (albo więcej) ale tak na prawdę to są dwa, na początek radziłbym Pascal (broń boże basic) kup jakąś książkę Niclausa Wirtha, poszukaj w internecie, znajdziesz FreePascala, dobry kompilator, kompilator czyli program do pisania programów, szukaj dalej to znajdziesz mrowie programów (żródeł, czyli programów napisanych w pascalu), poczytaj, zobaczysz jak inni piszą programy. Zrozumiesz po drodze jak to wszystko działa. Drugi język to C, książka Kernigham i Ritche (jakoś takoś się to pisze). Będzie trudniej, bo i C jest obszerniejsze, i uruchamianie programów trudniejsze. Przyszłość jest w C (w zasadzie już terażniejszość) ale jednak radzę, zacznij od pascal, później poznasz C, a potem już z górki ;)
    A o losowaniu pogadamy następnym razem
  • REKLAMA
  • #3 873559
    PJS
    Poziom 15  
    Posty: 110
    Pomógł: 12
    Ocena: 3
    Coś mi padło w przeglądarce i nie wiem czy poprzednia odpowiedź "poszła". Na forum jej nie widziałem więc pisze jeszcze raz.
    W "Komputer Expert" (i pochodnych czasopismach) były kiedyś (nie wiem czy jeszcz są) kursy Builder C++ i Delphi, a na płytkach mieli zamieszczone darmowe wersje tych "kompilatorów". Ale bez książek i tak się nie obejdzie - podstawy są najważniejsze.
    Książka Kernighan'a i Ritchie'go nosi tytuł "Język ANSI C".
  • REKLAMA
  • #4 873856
    zibiw
    Poziom 12  
    Posty: 20
    Pomógł: 1
    A ja na twoim miejscu jako pierwszego języka uczył bym się Basica. Xitami odradza go i proponuje Pascala .Obydwa są dość proste do opanowania tym niemniej gdybyś np. poprzestał na tym etapie to z basica możesz mieć większe kożyści. Microsoft zaimplementował go prawie w każdej większej aplikacji . A także jest w corelu,autocadzie i wielu innych.Możesz za jego pomocą tworzyć makra ułatwiające prace w tych programach.
  • #5 874377
    Siber
    Poziom 11  
    Posty: 38
    Ocena: 1
    Ja radziłbym rozpocząć przygodę z programowaniem z językiem pascal, kompilator -
    Turbo pascal 7, patch niwelujący błąd dzielenia przez zero, kursy dla początkujących można znaleźć w sieci (google: tp kurs). Dobrą książką jest "Turbo pascal i Delphi od lat 8 do 88" chociaż ten Delphi jak ci nie potrzebny to może coś Heliona, to dobre wydawnictwo, możesz zamówić książkę przez internet, dobra książka: "Wstęp do programowania z przykładami w Turbo Pascalu" Krystyna Koleśnik wyd. Halion.
    P.S. zibiw, jakim cudem będąc raczkującym urzytkownikiem masz ponad 20 pkt.?
  • #6 875245
    zibiw
    Poziom 12  
    Posty: 20
    Pomógł: 1
    Zawdzięczam to właśnie Visual Basicowi .Napisałem programik i go wysłałem na upload elektrody.
  • #7 887199
    jemand
    Poziom 13  
    Posty: 24
    Pomógł: 6
    Ocena: 1
    Zdecydowanie do nauki programowania najlepsza jest Java! Dlaczego?
    1. Jest za darmo. Kompilator języka na różne platformy można znaleźć na stronie suna (www.javasun.com), dostępne sa takze darmowe środowiska IDE np. JBuilder (szczególnie polecam www.borland.com), JDeveloper(www.oracle.com) czy Eclipse
    2. Java "wyrabia" dobre nawyki programowania obiektowego.
    3. Język jest prosty i przejżysty z dużą liczbą różnorodnych i udokumentowanych klas (np. w prosty sposób przetwarza się grafikę, muzykę, buduje aplikacje okienkowe...)
    4. Dostępna jest bogata pomoc w sieci np. jGuru ...
  • #8 888256
    maxdutka
    Poziom 15  
    Posty: 169
    Pomógł: 4
    Ocena: 12
    Jak by się uparł bo bez żadnego dodatkowego programu można zrobic program np. pod Windowsa: jest tam taki program jak debug, umożliwia on pisanie w asemblerze itp. Jednak nie polecam zaczynać pisać programów w asm. Co do języka programowania jaki mogę polecic to wszystko zależy od tego czy myślisz o programowaniu na serio czy chcesz się tylko pobawić.
  • REKLAMA
  • #9 890931
    Jarciom
    Poziom 11  
    Posty: 6
    Ocena: 1
    Tu masz przykladowy programik w pascalu napisalem go chyba jakies 8 lat temu sluzy on do losowania 6 liczb do totolotka zadna liczba sie nie powtorzy, mozna go rowniez latwo przerobic do twoich potrzeb ale to juz zostawiam dla ciebie :]

    program losowanie;
    uses crt;
    const n=49;
    type zbior=set of 0..n;
    var x,a:zbior;
    i,j,k:integer;
    z:char;
    b:array [1..6] of integer;
    begin
    repeat
    x:=[1..n];
    a:=[];
    a:=x;
    clrscr;
    randomize;
    for i:=1 to 6 do
    begin
    j:=0;
    b[i]:=random(n)+1;
    repeat
    if (b[i]in a) then
    begin
    a:=a-[b[i]];
    j:=1;
    end
    else b[i]:=random(n)+1
    until j=1;
    end;
    for j:=1 to 5 do
    for i:=j+1 to 6 do
    begin
    if b[j]>b[i] then
    begin
    k:=b[j];
    b[j]:=b[i];
    b[i]:=k;
    end;
    end;
    for i:=1 to 6 do
    write(b[i]:3);
    writeln;
    writeln('nacisnij dowolny klawisz zeby kontynuowac albo "k" zeby skonczyc');
    z:=readkey;
    until z='k';
    end.
  • #10 895638
    TheVoid
    Poziom 11  
    Posty: 13
    Dodam taką małą uwagę. Żaden komputer nie wylosuje ci liczb losowo. To komputerowe "losowanie" wykonywane jest przez algorytm, a więc jest to jakaś reguła. Dlatego powinno się mówić o liczbach pseudo losowych!

    Pozdro.
  • #11 899755
    Paweł Es.
    VIP Zasłużony dla elektroda
    Posty: 6981
    Pomógł: 1236
    Ocena: 691
    Tak zwykle komputery liczą liczby "losowe" wg wzoru (generator kongruencyjny):

    Xn = (A*Xp+B) MODULO C

    gdzie

    Xn - liczona liczba losowa
    Xp - poprzednia liczba losowa (tzw. SEED)

    A,B,C - duże liczby pierwsze (te podzielne tylko przez siebie i 1 )

    w Pascalu funkcja Randomize oblicza początkową wartość SEED na podstawie odczytu czasomierza.

    Im większe A,B,C tym dłuższy okres sekwencji "losowej".

    Takie liczenie ma zaletę, że dla tej samej wartości początkowej generator wytwarza ten sam ciąg liczb "losowych" co jest przydatne w kryptografii.
  • #12 905481
    _sid
    Poziom 11  
    Posty: 6
    Tak - wazne jest czy chcesz programowac na powaznie czy tylko dla zabawy!

    Jezeli to drugie to radze pouczyc sie podstaw pascala, sciagnac darmowy kompilator Delphi + kurs (w sieci tego pelno) i juz mozesz stworzyc niezle programy dla wlasnych potrzeb ...

    Jezeli myslisz powaznie o programowaniu - zrob to co wyzej, pobaw sie troche a potem zacznij uczyc C++, Buildera i podstaw asm'a

    Odradzam Jave - jezyk zbudowany na bazie C++, ma duzo bibliotek i dziala na wielu platformach - fakt, ale jest strasznie wolny a i tak trzeba miec maszyne wirtulana zeby go odpalic albo bawic sie w konwertowanie - ale wtedy bedzie dzialal tylko na danej platformie ... jak dla mnie to jest jezyk przejsciowy, niedlugo wymysla cos szybszego i Java sie ine utrzyma ... ale to tylko moja opinia :p
  • #13 936258
    kot_nieplot
    Poziom 2  
    Posty: 4
    Jeśli chodzi o wybór języka programowania: zależy, w jaki sposób myślisz ;)
    Jeśli masz myślenie bardzo techniczne, to zacznij od razu od C++
    Odradzam wtedy Pascala, bo jest uciążliwy i sztywny w pisaniu i znienawidzisz programowanie.
    C jest również sztywny, ale ma ogromne możliwości.
    Ja uwielbiam C++, ma największe możliwości, wystarczy go tylko pojąć, nie ma skomplikowanej struktury zresztą.
    Jeśli jesteś humanistą/humanistką, nie wróżę dobrej przyszłości... :P ale zawsze możesz się sprawdzić.
    Jeśli chcesz programować dla zabawy, polecam Basica. Jes dość prosty.
    Ja zaczynałem od Visual Basica. Ma tą zaletę, że możesz sobie w dość krótkim czasie zrobić oprawę graficzną.
    Ja zaczynałem od Visual Basica.

    A tak z ciekawości - obejrzyj www.oi.edu.pl
  • #14 964498
    arek.ka
    Poziom 2  
    Posty: 2
    Ja musze napisac na zaliczenie program lotto w pascalu, powyzsze informacje mi bardzo pomogly, ale jest jeszcze cos czego nie umiem zrobic. Zadanko wyglada nastepujaco: najpierw podaje swoje liczby, komputer losuje swoje, a nastepnie stwierdza ile mam trafien, czy moglby mi ktos pomoc? z gory dzieki
  • #15 964867
    Xitami
    Poziom 29  
    Posty: 1130
    Pomógł: 118
    Ocena: 31
    Jak to zwykle, zaczynamy od tego co wiemy
    const
    __ileLiczb = 6;
    __maxLiczba=49;
    type
    __liczba=1..maxliczba;
    __tZaklad=array[1..ileLiczb] of liczba;

    czasem takie restrykcyjne określenie typów przeszkadza (np. brak miejsca dla wartownika), ale zwykle pomaga, czasem już kompilator da nam po łapach.
    Potrzebne zmienne to: moje liczby, te wylosowana przez komputer i liczba trafień
    var
    __moje, komputera: tZaklad;
    __trafione: byte;

    część główna może wyglądać tak
    begin
    __pobranieLiczb(moje);
    __losowanie(komputera);
    __trafione:=ileTrafien(moje, komputera);
    __writeln(trafione);
    end.

    zacznijmy od najłatwiejszego, niech komputer zapyta nas o nasze liczby
    procedure pobranieLiczb(var z:tZaklad);
    {ważne: VAR, parametr przekazywany przez zmienną, no bo musimy być w stanie ją zmienić}
    var i:integer;
    begin
    __for i:=1 to ileLiczb do
    ____readln(z[ i ])
    end;

    łatwizna. No to teraz zobaczmy jak może wyglądać sprawdzenie
    function ileTrafien(c, k: tZaklad):integer;
    var trafione, i, j:integer;
    begin
    __trafione:=0;                     {na początek jeszcze nic nie wiemy}
    __for i:=1 to ileLiczb do        {musimy sprawdzić każde nasze skreślenie}
    ____for j:=1 to ileLiczb do     {z każdą wylosowaną przez komputer liczbą}
    ______if c[i]=k[j] then         {o! Równe}
    ________inc(trafione);        {no to zapamiętajmy to}
    __ileTrafien:=trafione;       {i pochwalmy się jak bardzo się udało}
    end;

    Zostało nam losowanie, było już o tym na Elektrodzie,
    tu i tu. Jak to zwykle bywa można coś zrobić na 1001 sposobów.Najprostrzy:
    procedure losowanie1(var z:tZaklad); {znowu „var”!}
    var i:integer;
    begin
    __for i:=1 to ileLiczb do
    ____z[i]:=random(maxLiczba)+1
    end;

    no świetnie ale tu przecie liczby mogą się powtórzyć, a w lotto jest to niemożliwe. Czyli trzeba pokombinować.
    procedure losowanie(var z:tZaklad);
    var i,j:integer;
    begin
    __for i:=1 to ileLiczb do
    ____repeat
    ______z[ i]:=1+random(maxLiczba+1);      {na próbę wylosujmy coś}
    ______j:=1;
    ______while j < i do                {ale sprawdźmy czy już tego nie było}
    ________if z[j]=z[ i]
    __________then break           {było! Nie sprawdzamy dalej}
    __________else inc(j);           {jeśli nie na tej pozycji to może na kolejnej}
    ____until j>=i                        {skoro j jest >= i, to znaczy że sprawdziliśmy wszystkie dotąd wylosowane}
    ____________{jeśli j zatrzymało się wcześniej to znaczy że trzeba z[ i] wylosować jeszcze ras}
    end;

    Podobnie trzeba by postąpić w pobranieLiczb.
    Działająca wersja „β” w załączniku.
    Załączniki:
    • lotto.txt (906 Bajtów) Musisz być zalogowany, aby pobrać ten załącznik.
  • #16 964932
    arek.ka
    Poziom 2  
    Posty: 2
    Wielkie dzieki za pomoc troche bede musial to przerobic, bo zadanko ktore mam napisac to dokladnie: szczesliwy numerek - lotto, a tam są dwa losowania najpierw 4 liczb, a pozniej szczesliwego numerka

    z gory jeszcze raz dziekuje

Podsumowanie tematu

✨ Dyskusja dotyczy stworzenia symulatora LOTTO do losowania liczb bez powtórzeń, z uwzględnieniem kolejnych losowań wykluczających wcześniej wylosowane liczby. Poruszono kwestie wyboru języka programowania i narzędzi do nauki programowania na systemie Windows XP. Zalecane języki to Pascal (np. Turbo Pascal 7 z darmowym kompilatorem FreePascal), C, C++ oraz Visual Basic, z uwzględnieniem ich zalet i trudności. Wskazano na dostępność kursów i książek, takich jak "Język ANSI C" Kernighana i Ritchiego oraz "Turbo Pascal i Delphi od lat 8 do 88". Podkreślono, że Windows XP nie posiada wbudowanego środowiska programistycznego, więc potrzebny jest zewnętrzny kompilator lub IDE. Przykładowo podano fragment programu w Pascalu realizującego losowanie liczb bez powtórzeń. Omówiono także zasadę działania generatorów liczb pseudolosowych (np. generator kongruencyjny) oraz ich ograniczenia. Wskazano, że do nauki programowania warto zacząć od prostych języków, a następnie przejść do bardziej zaawansowanych. Poruszono także temat programowania na poważnie versus dla zabawy oraz różnice w szybkości i zastosowaniach języków takich jak Java, Pascal, C++ i Visual Basic. W końcowej części dyskusji pojawiły się przykłady implementacji programu lotto w Pascalu, w tym pobieranie liczb od użytkownika, losowanie i sprawdzanie trafień.
Wygenerowane przez model językowy.
REKLAMA