Patzick |
» 2008-11-16 13:52:10 Ja wykombinowałem coś takiego, może nie zrobiłem tego w jednej pętli ale chyba aż tak źle nie jest :P powodzenia innym xD #include <iostream> #include <conio.h> #include <ctime> using namespace std;
int jeden = 0; int dwa = 0; int trzy = 0; int cztery = 0; int piec = 0; int szesc = 0; int liczba, liczba_teraz; int spr = 0;
int random( int nMin, int nMax ) { return rand() % nMax + nMin; }
void losowanie() { liczba = random( 1, 49 ); if( jeden == liczba || dwa == liczba || trzy == liczba || cztery == liczba || piec == liczba || szesc == liczba ) { spr = 1; } else { spr = 0; } };
void sprawdzanie() { if( spr == 1 ) { while( spr == 1 ) { losowanie(); liczba_teraz = liczba; }; } else { liczba_teraz = liczba; }; };
main() { srand( static_cast < int >( time( NULL ) ) ); cout << "++++++++++++++++++++\n LOTTO bez tablic\n--------------------\nby Patzick\n"; losowanie(); sprawdzanie(); jeden = liczba_teraz; losowanie(); sprawdzanie(); dwa = liczba_teraz; losowanie(); sprawdzanie(); trzy = liczba_teraz; losowanie(); sprawdzanie(); cztery = liczba_teraz; losowanie(); sprawdzanie(); piec = liczba_teraz; losowanie(); sprawdzanie(); szesc = liczba_teraz; cout << "\n\nWyniki losowania:\n " << jeden << "," << dwa << "," << trzy << "," << cztery << "," << piec << "," << szesc; getch(); }
|
|
DejaVu |
» 2008-11-16 14:06:29 Na moje oko poniższy warunek jest niepoprawny: if(( jeden || dwa || trzy || cztery || piec || szesc ) == liczba ) |
|
Patzick |
» 2008-11-16 14:34:15 Zmieniłem warunek na if( jeden == liczba || dwa == liczba || trzy == liczba || cztery == liczba || piec == liczba || szesc == liczba )
mam nadzieję, że teraz wszystko dobrze :) |
|
Patzick |
» 2008-11-16 15:23:42 cóż, po kilku próbach dla upewnienia się czy Twój kod działa wyskoczyła mi taka kombinacja cyfr
49 8 41 45 44 8
więc niestety wynik się powtarza. |
|
Patzick |
» 2008-11-16 17:19:23 więc mam pomysł, dorzućmy do tego kod, który obliczy szybkość działania samego algorytmu losowania. Czyli tak włączasz program, on czeka na Twoją reakcję (getch)po czym losuje te liczby mierząc czas losowania i podaje go na końcu po wyświetleniu wyników losowania :) zaraz pomodzę coś takiego i od razu postaram się przyspieszyć mój kod :P |
|
Patzick |
» 2008-11-16 19:01:12 szukam jakiegoś dobrego algorytmu na zliczenie tego ale nie mogę znaleźć ;/ najlepsze co mogę znaleźć to liczy tylko sekundy, a to jest strasznie niedokładny wynik nawet dla 100 czy 1000 powtórzeń. Jakieś pomysły? //EDIT znalazłem rozwiązanie, przy wklejeniu kodu zobaczycie je, tylko ten czas nie zawsze jest taki sam, i w sumie nie będzie bo to zależy od szybkości komputera, która też nie jest taka sama cały czas bo komp może być np czymś obciążony, ale mniejwięcej można coś wyliczyć :) //EDIT 2 Więc mam różnice czasów średnio na 1 obliczenie Twoje wyniki to ok 2.9 milisekundy moje ok 5.8 milisekundy także sromotna porażka mojego algorytmu :P ale jak na ograniczenia to i tak nie jest źle ;) a przydatny program do odczytywania czasu systemowego poniżej #include <Windows.h> #include <stdio.h>
main() { SYSTEMTIME st; GetSystemTime( & st ); printf( " Hour:%d\n Min:%d\n Second:% d\n Milisekund:%d\n", st.wHour, st.wMinute, st.wSecond, st.wMilliseconds ); }
|
|
Patzick |
» 2008-11-16 20:38:13 wynik wynosi idealnie 2.03 milisekundy na operację, nie jest tak szybkie jak się spodziewałem (myślałem, że koło 1.8 będzie) ale za to stabilne- w 98% prób wynosi 2.03 :) mamy więc punkt odniesienia zarówno pod względem średniego czasu jak i stabilności kodu :) |
|
manfred Temat założony przez niniejszego użytkownika |
[KONKURS] lotto bez tablic » 2008-11-16 09:10:06 Hehehe. Mam pomysł na ciekawy konkurs. Chodzi w nim o to, żeby napisać lotto bez tablic, czyli program musi losować 6 liczb z przedziału 1..49 nie powtarzających się, a następnie je wypisać. To wszystko bez używania tablic. Zasady : napisać najkrótszy i najszybszy (najmniej pętli z najsłabszym losowym warunkiem zakończenia) algorytm, który wylosuje 6 z 49 bez powtórzeń i bez użycia tablic. założenie jest takie, że rand()%n <> 0 może trwać i milion iteracji (oczywiście czysto teoretycznie), nie mówiąc już o (rand()%n <> 0) and (rand()%n <> 0) and ... Oczywiście wyniki muszą być całkowicie losowe, więc nie bawimy się w rand()%7, 7+rand()%7,14+rand()%7 itp. Ja już swój program mam gotowy, ale używa on tylko jedną pętlę, więc nie chcę wam psuć zabawy. Rozwiązania proszę wrzucać w tym topicu. |
|
« 1 » 2 |