Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Losowe liczby w C++. Generują się te same liczby.

22 Lut 2011 20:41 6431 9
  • Poziom 9  
    Witam,

    Mam mały problem ze swoim kodem. Moim zamiarem było wygenerowanie dziesięciu losowych liczb z zakresu 1 do max (gdzie max jest zmienną).

    W kodzie jest gdzieś błąd bowiem generują się liczby o tej samej wartości. Będę bardzo wdzięczny za wskazanie błędu.

    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    Program kompilowany w Code Blocks 10.05

    Pozdrawiam,
    Dawid

    Proszę pamiętać o używaniu znaczników code. - arnoldziq
  • Pomocny post
    Poziom 40  
    Czy funkcji srand (time(NULL)); nie inicjowało się tylko raz, na początku programu?
  • Pomocny post
    Poziom 16  
    Wkładaj swój kod źródłowy w tagi [code]kod źródłowy[/code] bo inaczej się czyta tragicznie. ;)
    Kod: c
    Zaloguj się, aby zobaczyć kod
    Seeduj tylko raz, najlepiej na początku programu. Ten sposób da Ci i tak takie same wyniki, jeżeli program uruchomisz dwa razy w ciągu "tej samej sekundy".

    rand() to nie jest najlepszy sposób na liczby pseudolosowe, ale do rzeczy podstawowych wystarczy. Jeżeli chcesz czegoś lepszego to poszukaj na przykład w Boost. ;)
    http://www.boost.org/doc/libs/1_46_0/doc/html/boost_random.html
  • Poziom 9  
    Dziekuje za obie odpowiedzi- obie byly trafne :)

    Problem rozwiazany ale jak to w zyciu pojawil sie kolejny a raczej dwa:

    1. przy kolejnych losowaniach, wylosowane liczby sa za kazdym razem takie same
    2. odnosnie tego malo doskonalego sposobu na losowanie liczb pseudolosowych- czy moglbys Azar zmodyfikowac moj kod? Nie chodzi o mój problem z angielskim tylko o mój problem z programowaniem :) - nie jest dla mnie wystarczajaco dobrze zrozumiała tresc podanego linku

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Dziękuję serdecznie,
    Dawid
  • Pomocny post
    Poziom 16  
    Najpierw co do kodu:Co robi ta linijka? ;)
    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    A to co jest?
    Kod: cpp
    Zaloguj się, aby zobaczyć kod
    VLA (Variable Length Array) to "ficzer" C99, nie C++ ;) Użyj wskaźnika i new/delete, albo std::vector:
    Kod: cpp
    Zaloguj się, aby zobaczyć kod
    std::vector

    Nie musisz deklarować swoich zmiennych na górze bloku... Ja uważam to za kiepski styl. Raczej deklaruj (jeśli można, to od razu inicjalizuj) zmienne tam, gdzie są Ci potrzebne.

    Zamiast tych do..while czytelniejsze byłyby pętle for, w końcu znasz zasięg (i licznik byłby zmienną lokalną dla pętli, w końcu i tak nie potrzebujesz go nigdzie indziej). Oczywiście to najbardziej zewnętrzne do..while już ma sens. :)

    Żeby użyć Boost::random musiałbyś najpierw mieć bibliotekę Boost zainstalowaną. Ona nie jest częścią standardu (ale jej części stają się częścią nowego standardu C++0x), dlatego pewnie jej nie masz... Jeśli jesteś zainteresowany, to najprościej będzie zainstalować sobie MinGW distro od Nuwen, które zawiera dodatkowo parę mniejszych bibliotek, oraz Boost: Nuwen MinGW distro

    Jeśli robisz to do szkoły, to Boost odpada, bo najpewniej profesorek będzie chciał sobie skompilować kod samemu, a jeśli jego zainteresowanie programowaniem w C++ zakończyło się na 1988... ;)
  • Poziom 9  
    Arar dziękuję za jasną i szybką odpowiedź.

    Odnosnie Twoich zapytań:

    Ad 1. "Co robi ta linijka"
    Kod: cpp
    Zaloguj się, aby zobaczyć kod
    - wybiera ona wartość losową z przedziału od max (zmienna) do 1.

    Ad. 2. "A to co jest"
    Kod: cpp
    Zaloguj się, aby zobaczyć kod
    - jeżeli chodzi o dopisek std::, wiem ze mozna łatwiej (using namespace)

    Ad. 3. "VLA" nie jest to dla mnie na razie zbyt jasne i nie wiem czemu nie powinno sie stosować tablic w sposób w jaki ja to zrobiłem
    (Link

    Ad. 4. Dzieki za poradę odnośnie jakości kodu (deklarowanie zmiennych)
    Ad. 5. Dzięki za poradę odnośnie jakości kodu (pętla for)
    Ad. 6. Dzieki za info z pseudozmiennych :)
    Ad. 7. Do szkoły tego nie robię. Studia skończyłem jakiś czas temu- niestety mechanikę, nie informatykę. C++ jest mi potrzebne do napisania programu ułatwiającego mi pracę i dla fanu by the way. Bynajmniej nie jest to program do generowania liczb losowych- to jest taki wstęp można by powiedzieć.

    Wracając do tematu:
    1. Kod zoptymalizowany
    2. Pozostał problem z generowaniem za każdym powtórzeniem tych samych liczb po wykonaniu petli do...while
    3. Pojawił się nowy problem: jak zresetować, zmienioną przez pierwszą pętlę (for) zmienną (została ona zmieniona z wartości "i" na "0". Wartości oryginalnej zmiennej "i" potrzebuję użyć w drugiej pętli for w miejscu

    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    Jeżeli zostawię program tak jak jest wartość i jest brana z poprzedniej pętli for (i=0).


    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    Dziękuję za pomoc

    Dodano po 50 [minuty]:

    Będę wdzięczny za odpowiedź na swój powyższy wpis a w międzyczasie pomyślałem ze mój problem odnosnie resetowania zmiennej moze zostać rozwiązany przez użycie funkcji. Jak pomyślałem tak też zrobiłem. Kompilator wywala jednak błąd przy pierwszej pętli for. Dlaczego??

    Kod: cpp
    Zaloguj się, aby zobaczyć kod
  • Poziom 32  
    neke napisał:
    Arar dziękuję za jasną i szybką odpowiedź.

    Odnosnie Twoich zapytań:

    Ad. 2. "A to co jest"
    Kod: cpp
    Zaloguj się, aby zobaczyć kod
    - jeżeli chodzi o dopisek std::, wiem ze mozna łatwiej (using namespace)



    Sądze, że Ararowi chodziło bardziej o deklarację tablicy. Wielkość tablicy powinna być znana w momencie kompilacji. Są pewne rozszerzenia C (chyba C99) które coś takiego, jak napisałeś przyjmują, ale to nie jest standard.


    neke napisał:


    Kod: cpp
    Zaloguj się, aby zobaczyć kod



    Może zastanów się ile razy chcesz wołać funkcja_i?? W każdym miejscu gdzie masz napisane funkcja_i() nastąpi wywołanie tej funkcji i zapytanie użytkownika. Chyba nie o to chodziło?
    A błąd jest już rzeczą wtórna - wyniku funkcji nie można modyfikować. To tak jakbyś chciał zmodyfikować wynik dodawania 2+2.
    Chyba nie bardzo rozumiesz do czego służą funkcje.
  • Poziom 9  
    Chyba niestety masz rację :)
    Dzięki- podziałam i jak nie wyjdzie to sie pewnie pojawi nowy wpis się.
  • Pomocny post
    Poziom 16  
    neke napisał:
    Arar dziękuję za jasną i szybką odpowiedź.
    "azra". ^^

    neke napisał:
    Ad 1. "Co robi ta linijka"
    Kod: cpp
    Zaloguj się, aby zobaczyć kod
    - wybiera ona wartość losową z przedziału od max (zmienna) do 1.
    I co robi z tą wartością? Nic. ;) Nigdzie jej nie zapisuje, więc jest po prostu zbędna. Gdybyś kompilował z -Wall -Wextra to dostałbyś ostrzeżenie, że ta linijka kompletnie nic nie robi.

    neke napisał:
    Ad. 3. "VLA" nie jest to dla mnie na razie zbyt jasne i nie wiem czemu nie powinno sie stosować tablic w sposób w jaki ja to zrobiłem
    (Link
    Na tej stronie nie ma nigdzie takiego użycia jak Ty to zrobiłeś. VLA to Variable Length Array (google się kłania), czyli taka tablica, której możesz nadać rozmiar w czasie wykonywania programu. Zauważ, że nie znasz jej rozmiaru przed kompilacją. Nie jest to zwykła tablica statyczna, w C++ jest to błędny kod.
    Działa tylko dlatego, że nie kompilujesz w trybie -pedantic - włączone masz więc niestandardowe rozszerzenia. VLA jest standardowe ale w C - i to w nowszym standardzie, tj C99. Nie ma go w C89/C90, ani w C++ - z tym, że GCC (kompilator) udostępnia VLA jako niestandardowe (dla C89/C90 i C++) rozszerzenie.

    neke napisał:
    Ad. 7. Do szkoły tego nie robię. Studia skończyłem jakiś czas temu...
    No to masz jeszcze przed sobą trochę czasu zanim będziesz się dość płynnie obracać w temacie, ale nie martw się, to nie jest aż takie trudne. ;) Jeśli tak, to zainteresuj się moim tutorialem (krok po kroku) tutaj: http://thenewboston.com/forum/viewtopic.php?f=129&t=8056
    Po instalacji Nuwen MinGW Distro (link w temacie) będziesz miał Boost i dostęp do "różnych fajnych rzeczy". ;)

    neke napisał:
    2. Pozostał problem z generowaniem za każdym powtórzeniem tych samych liczb po wykonaniu petli do...while
    Wyciągnij srand() poza pętlę. Jeżeli już to zrobiłeś (a tak by to wyglądało z kodu) to może uruchamiasz ciągle stary kod? Przebuduj? Bo być to nie może, żeby się tak buntowało. :P


    Kod: cpp
    Zaloguj się, aby zobaczyć kod