Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

zad. 21 - czy ide w dobrym kierunku?

Ostatnio zmodyfikowano 2017-05-31 03:09
Autor Wiadomość
thomson92
Temat założony przez niniejszego użytkownika
zad. 21 - czy ide w dobrym kierunku?
» 2017-05-19 11:33:56
Staram się samodzielnie (bez podglądania w inne zrobione juz przykłady) zrobić funkcje losującą liczby bez powtórzeń. Zdaję sobie sprawę, że prawdopodobnie robię to maksymalnie na około jednak mam wrażenie, że jestem blisko. Niestety program losuje mi ciągle te same wartości. Byłbym bardzo wdzięczny za jakiekolwiek wskazówki.



C/C++
void losowanieBez()
{
    srand(( unsigned int ) time( NULL ) );
    int rozmiar, a, b, spr, x;
    int t[ 1000 ];
    bool test;
    x = 1;
   
    cout << "dolna granica: " << endl;
    cin >> a;
   
    cout << "gorna granica: " << endl;
    cin >> b;
   
    cout << "ile losow: " << endl;
    cin >> rozmiar;
   
    spr = rozmiar;
   
    do
    {
        test = 1; // domyslnie jest true zeby petla mogla dokonac dekrementacji przy pierwszej liczbie ktora nie jest sprawdzana
        int i = 0; // zawsze na poczatku petli wraca do wartosci 0
        t[ rozmiar ] = rand() %( b - a + 1 ) + a; //losowanie
       
       
        if( rozmiar <=( spr - 1 ) ) // petla sprawdzajaca dopiero od drugiego wyrazu
        {
            cout << "Sprawdzanie... " << endl;
            do
            {
                if( t[ rozmiar ] = t[ spr - i ] ) // ostatnia wylosowana wartosc porownywana od pierwszej wylosowanej...
                     test = 0;
                else
                     i++;
               
            } while( rozmiar <( spr - i + 1 ) && test == 1 ); // ...aż do  momentu, kiedy zacznie porownywac do siebie te same wartosci
           
        }
       
        if( test = 1 ) // jezeli zmienna test bedzie true petla dokona dekrementacji w innym przypadku losuje ponownie wartosc
        {
            cout << "Losowanie nr. : " << x++ << endl;
            cout << "Wartosc: " << t[ rozmiar ] << endl;
            cout << "indeks tablicy: " << rozmiar << endl;
            cout << "spr: " << spr << endl << endl;
           
            rozmiar--;
            //system("pause");
        }
    } while( rozmiar > 0 );
   
}

P-161290
hit
» 2017-05-19 11:37:33
Wyjmij
srand(( unsigned int ) time( NULL ) );
 z funkcji. Wywołaj raz na początku programu.

Edit:
Popatrzyłem sobie jeszcze na kod i masz tam błędy.
if( test = 1 )
if( t[ rozmiar ] = t[ spr - i ] )

http://cpp0x.pl/kursy/Kurs-C++/Poziom-1/Operacje-porownania/14
P-161291
thomson92
Temat założony przez niniejszego użytkownika
» 2017-05-19 15:47:17
Dzięki za pomoc, znalazłem jeszcze 2 błędy w petli, która miała sprawdzać powtórzenia.

C/C++
do
{
    if( t[ rozmiar ] = t[ spr - i ] )
         test = 0;
    // BRAKOWAŁO i++ w tym miejscu
    else
         i++;
   
} while( rozmiar <( spr - i + 1 ) && test == 1 ); // Tutaj te + 1 nie było potrzebne bo wtedy pętla wykonywała się o 1 raz za dużo i porównywała dwie te same wartości i zawsze zwracała false.



Raz jeszcze wielkie dzięki za pomoc i pozdrawiam.
P-161298
TobiPL
» 2017-05-31 03:09:51
Zawsze możesz zrobić np. tablicę która zawiera sobie wartości... np.

Liczba , Adres następnej komórki

i np. robimy tablicę z 100 takich obiektów :P...



Potem losujemy liczbę od 0 do max. liczby Komórek...
Potem Pobieramy z wybranej komórki wartość...
A na końcu Kasujemy Komórkę z liczbą i przestawiamy Adres tak aby było to dalej "w całości"

Fajny i lekko "szalony" pomysł ale w ten sposób nigdy przenigdy nie wylosuje ci 2 takich samych liczb :D...


ale odnośnie szaleństw :D...

1) srand(( unsigned int ) time( NULL ) );
jeśli dobrze pamiętam wystarczy to zadeklarować RAZ ;D ... a dodałeś to do Funkcji...
która prawdopodobnie może być wykonana Wielokrotnie ^_^ warto by przestawić to np. na szczyt Main-a albo gdzieś poza funckje :D

2) if( test = 1 )
ja piszę w swoim QLG-u a nie w C++... więc mam świadomość że u mnie cos takiego jest Przypisaniem a nie sprawdzeniem...
Nie powinieneś mieć przypadkiem tam 2 znaków równości ? :P Równouprawnienie kurde :D !



mógłbyś też po prostu zrobić tak... że robisz Tablicę wielkosci wylosowanych Liczb...
i tablica przechowuje wartości które zostały wylosowane... jak Nowo wylosowana liczba jest już w tablicy to wylosować ponownie :P

ale po wylosowaniu np. 500.000 wartości ta tablica będzie w piździec wielka :D...

Dlatego lepsza już moim zdaniem byłaby metoda wcześniej opisana przezemnie :P


Po wylosowaniu wszystkich 100 liczb z poprzedniej metody można by zadeklarować na nowo całą tablicę i losować ponownie ^_^





Tutaj już tylko moja sugestia...
mógłbyś pisać zamaist:


    cout << "ile losow: " << endl;
    cin >> rozmiar;

to:


cout<<"Ile losow: "<<endl;cin>>rozmiar;

Warto ... oszczędzać użytkowność Entera ^_^...
przynajmniej moim zdaniem ale zrobisz jak chcesz xDDD...
w końcu nie musisz się interesować moimi sugestiami jestem tylko nieznajomym idiotą :D...


idziesz w dobrym kierunku ale po przeciwnym zwrocie do oczekiwanego :D... nie no taki joke xDDDD



//Edit: a tak w ogole czemu w tym kodzie jest "endl" przed Cin ? :D... bosz nie dodawan ENDL przed CIN xDDD
to wygląda fatalnie :D lecz to ponowna moja sugestia ;x...
P-161845
« 1 »
  Strona 1 z 1