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

[C] przydział pamięci i rozmiar tablicy

blue_17 18 Mar 2012 23:35 1080 6
  • #1 18 Mar 2012 23:35
    blue_17
    Poziom 32  

    Witam napisałem sobie taki oto kod

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Proszę o sprawdzenie ponieważ kiedy chcę wprowadzać rozmiar z klawiatury lub ustalam w programie jej wielkość czyli ile ma być wylosowanych liczb program zawiesza się w pętli losowania.

    Po wszelkich testach wychodzi na to iż chodzi o coś z przydałem pamięci :/

    Pozdrawiam

    0 6
  • #3 19 Mar 2012 11:17
    blue_17
    Poziom 32  

    Zmienna rozmiar mówi jak duż ma być tablica a min i max to zakres z jakiego ma losować.

    Więc niema problemu aby z zakresu od 2 do 2 wylosowało 9 pozycji o wartosci 2

    debbuger mówi że pętla wykonuje sie w nieskonczoność

    0
  • #4 19 Mar 2012 16:48
    krru
    Poziom 32  

    Ale masz w kodzie:
    rozmiar = zakres_max-zakres_min;
    Czyli zakres losowania jest dokładnie taki jak rozmiar tablicy. Jak jeszcze posortujesz wyniki
    dostaniesz 1,2,3,4,5,6,7,8 itp. (oczywiście zakładając dla uproszczenia że min == 1).
    Może lepiej użyć permutacji. Przy dużych rozmiarach będzie problem w trafieniem w liczbę, która jeszcze nie wystąpiła.

    Wystarczy jedno nie takie porównanie i masz zapętlenie bo w żaden sposób nie znajdzie ostatniej wartości, która by się nie powtórzyła.

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Ta konstrukcja mi się nie podoba. Nawet jak podstawisz x=0 to pod koniec petli for x zostanie zinkrementowany. Z drugiej strony i tak jeszcze co najmniej raz zostanie sprawdzony warunek while. Jakiś ten kod strasznie zakręcony.

    0
  • #5 19 Mar 2012 16:54
    blue_17
    Poziom 32  

    Linijkę o której mowa wyrzuciłem i również dla uproszczenia wyrzuciłem pętle do powtórzeń

    funkcja losująca ma taka postać


    Kod: c
    Zaloguj się, aby zobaczyć kod


    Okazuje się że jeżeli ilość liczb która ma być wylosowana jest z poza przedziału z którego losowane są liczby następuje zwieszenie

    0
  • Pomocny post
    #6 19 Mar 2012 21:27
    krru
    Poziom 32  

    blue_17 napisał:
    Zmienna rozmiar mówi jak duż ma być tablica a min i max to zakres z jakiego ma losować.

    Więc niema problemu aby z zakresu od 2 do 2 wylosowało 9 pozycji o wartosci 2

    debbuger mówi że pętla wykonuje sie w nieskonczoność


    Właśnie nie - masz/miałeś tą pętle eliminującą powtórzenia. Raz wylosujesz 2 i potem program w nieskończonej pętli losuje liczbę z zakresu [2,2] ale różną od 2. To tak, jakbyś w maszynę do totolotka wrzucił jedną kulę i chciał wylosować 9 liczb.
    Jeśli chcesz wylosować dokładnie n kolejnych liczb w losowej kolejności to po prostu weź ciąg i go pomieszaj poprzez zamianę liczb na losowych pozycjach.
    W bardziej ogólnym przypadku pierwszy raz losuj z przedziału [1, n], potem [1, (n-1)], dalej
    [1, (n-2)]. Wyniki traktuj jako indeks liczby w tablicy/liście, która ma być kolejnym wynikiem.
    Oczywiście wylosowana licza wypada z tablicy. Na kontenerach STL powinno być proste.

    0
  • #7 20 Mar 2012 16:20
    blue_17
    Poziom 32  

    Dziękuje za pomoc ale mnie olśniło i miałem właśnie pisać o tym co kolega :)

    Czyli jeżeli losujemy np liczby od 1 do 5 z włączeniem do puli 1 i 5 to bez powtórzeń możemy wylosować 5 liczb wiec program działał tak jak mu kazałem w takim przypadku pętla nie znajdywała rozwiazania - końca i program wisiał

    Przerobiłem to tak

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Problem mam teraz z tym ze kiedy dokonuję wyboru potem nie wyświetla mi wszystkich liczb a bez instrukcji wyboru kiedy "bezpośrednio" każe posortować po wylosowaniu wszystko jest w porządku

    oto dalsza cześć kodu

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Problem nawet pojawia się kiedy wciskam "n" przy wyborze więc to coś musi być nie tak ze samym switch-em :|

    0