• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Losowanie bez powtorzen

0 głosów
1,037 wizyt
pytanie zadane 11 września 2015 w C i C++ przez balti Obywatel (1,040 p.)

Witam mam problem z kodem jakby ktos mogł rzucic okiem na niego byłbym bardzo wdzięczny . Myslalem ze juz bedzie dzialac ale niestety program mimo wszystko, zwraca powtorzone liczby (o ile je napotka ) . Chodzilo mi, zeby bylo bez powtorzen o to kod :

#include <iostream>
#include <cstdlib>
#include <time.h>
#include <windows.h>

using namespace std;

int main()
{
    cout << "Losowanie 6 liczb bez powtorzen" << endl;
    int* tab = new int [6];
    //int tab[5];
    int liczba ;
    int k = 0;
    srand(time(NULL));
    for(int i = 0 ; i < 6 ; i++)
    {

    liczba = rand()%49+1;  // Przypisanie losowej liczby z zakresu od 1 do 49
        if(liczba == tab[i])
        {
            break;                        // Myslalem ze jesli tu uzyje break to cofnie mi do przypisania  liczba losowej wartosci i na dodatek petla for nie zliczy obiegu.
        }
        else                              // Jesli sie nie powtorzyla to przepisuje do tablicy tab wartosc.
        {
            tab[k]=liczba;
            k++;
        }


    }
    for(int i = 0 ; i < 6 ; i++)       // Na koncu poprostu wyrzucam wszystko na ekran .
    {
        cout << tab[i] << "\t";
    }
    return 0;
}

 

 

2 odpowiedzi

0 głosów
odpowiedź 11 września 2015 przez przeCinek19 Użytkownik (650 p.)
wybrane 11 września 2015 przez balti
 
Najlepsza

Twój sposób też zadziała tylko zamiast break spróbuj tak.

for(int i = 0 ; i < 6 ;)
    {
liczba = rand()%49+1;  // Przypisanie losowej liczby z zakresu od 1 do 49
        if(liczba == tab[i])
        {
            ;                       // Jesli sie powtorzy to nic sie nie wykona 
        }
        else                              // Jesli sie nie powtorzyla to przepisuje do tablicy, a i +1
        {
            tab[k]=liczba;
            i++;
            k++;
        }
}
komentarz 11 września 2015 przez balti Obywatel (1,040 p.)

Petla for mi nie zwiekszy zmiennej i  ? Dlatego musze inkrementowac w 11 linijce?

komentarz 11 września 2015 przez balti Obywatel (1,040 p.)
edycja 11 września 2015 przez balti
Teraz sprawdzilem ten kod i nadal zwraca ta sama wartosc ;D

http://screenshot.sh/mMhp16wXigp8u
+1 głos
odpowiedź 11 września 2015 przez Ehlert Ekspert (215,230 p.)

Losowanie bez powtórzeń, poważny krok laugh

Ogarnij sam algorytm... Utwórz tablicę i wypełnij ją indexami.

tab[0] = 0; //itd...

Potem robisz pętlę. For najlepiej. Na początku losujesz index, wyciągasz z tablicy liczbę o takim indexie, wkładasz ją do tablicy wyników. To co wylosowałeś w tej pierwszej zastępujesz jakąś wartością... niepotrzebną. -1000 etc. Pętla się powtarza ale na początku dodajesz warunek

//...
if(tab[ randed] == TAKEN )
        continue;
else //... bierzesz liczbę do result.

Mam nadzię, że opisałem zrozumiale. Mi ten sposób losowaina zawsze pomagał.

komentarz 11 września 2015 przez balti Obywatel (1,040 p.)
Ale gdybym wypelnil np tablice o rozmiarze 10   tak by w tab[0] = 5 ,  i np tab[7] = 5  (reszta tablicy obojetnie). To mimo wszystko zwrocilo by mi taka sama wartosc(5), a mi chodzilo by nie zwrocilo tej samej wartosci. Mozliwe, ze cos zle zrozumialem .

Podobne pytania

0 głosów
2 odpowiedzi 733 wizyt
pytanie zadane 29 października 2016 w C i C++ przez BlueWee Użytkownik (730 p.)
0 głosów
2 odpowiedzi 631 wizyt
0 głosów
4 odpowiedzi 456 wizyt
pytanie zadane 17 sierpnia 2015 w C i C++ przez Iras Obywatel (1,800 p.)

93,733 zapytań

142,669 odpowiedzi

323,287 komentarzy

63,294 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...