program do losowania liczb bez powtarzania

0

Program daje się skompilować, ale nie działa tak jak chce. Czy ktoś mógłby wytłumaczyć mi dlaczego?

 
#include <iostream>
#include <ctime>
#include <cstdlib>


bool byloczynie (int cyferka, int t[], int ile)
{
int i = 0;

if(ile==0)
{
    return false;
}
else
{
    do
    {
        if(t[i]== cyferka)
        return true;

        i++;

    }while(i<ile);

    return false;
}

}



int losowanie()
{

return (rand()%10)+1;
}



int main()
{

srand(time(0));
int wylosowanych = 0;
int tablica[5];


do{
    int liczba = losowanie();
    if(byloczynie(liczba, tablica, wylosowanych)==false)
    {
    liczba = tablica[wylosowanych];
    wylosowanych++;
    }
}while(wylosowanych<5);

int k = 0;
do{
    std::cout << tablica[k] <<std::endl;
    k++;
}while(k<5);

return 0;
}
3

Bo wynajdujesz koło na nowo i robisz to w bardzo słaby sposób?

unordered_set<int> wylosowane;
while(wylosowane.size()<5){
    int liczba = losowanie();
    if(wylosowane.find(liczba)!=set::end)
    {
        wylosowane.insert(liczba);
    }
}

Albo w ogóle, skoro to set:

unordered_set<int> wylosowane;
while(wylosowane.size()<5){
    wylosowane.insert(losowanie());
}
0

wystarczyło zmienić

 
if(byloczynie(liczba, tablica, wylosowanych)==false)
    {
    liczba = tablica[wylosowanych];
    wylosowanych++;
    }

na

 if(byloczynie(liczba, tablica, wylosowanych)==false)
    {
    tablica[wylosowanych] = liczba;
    wylosowanych++;
    }

i wszystko działa jak chciałem

1
misieq287 napisał(a):

wystarczyło zmienić

i wszystko działa jak chciałem

No to słabo chciałeś, bo działa mega nie optymalnie.

1

Przy losowaniu pięciu liczb spośród dziesięciu można się wydajnością nie przejmować. Widziałem program, w którym algorytm z tego wątku był zastosowany do losowania p punktów w tablicy o rozmiarze 1024x1024. Liczba p spełniała nierówność p<10241024 i była podawana przez użytkownika programu. Czekanie na wylosowanie punktów dla p=(10241024)-1 było dosyć frustrujące.
Edit, program zawsze losował punkty "potrzebne", chociaż dla p>1024*1024/2 wydajniejsze byłoby losowanie punktów "pomijanych".

1 użytkowników online, w tym zalogowanych: 0, gości: 1