Lewy1607 Temat założony przez niniejszego użytkownika |
c++ funkcja losująca liczby prawdziwie losowe » 2019-11-28 18:22:25 Witam.Ostatnio napisałem swój własny algorytm losujący i wyświetlający prawdziwie losowe liczby.Problem mam jednak taki,że jak użyje go wewnątrz funkcji,to program na niektórych podanych liczbach się wysypuje tj: 18,26,250 itp. Nie wiem w czym jest problem,ponieważ owy algorytm użyty bezpośrednio w funkcji main działa prawidłowo z tymi liczbami. Proszę o szybką pomoc.Pozdrawiam. algorytm użyty w funkcji: #include <iostream> #include <cstdlib> #include <time.h> using std::cout; using std::cin; void true_rand( int n );
int main() { int ile; cout << "Ile chcesz wylosowac prawdziwie losowych liczb i wyswietlic?: "; cin >> ile; cout << "\n"; true_rand( ile ); return 0; }
void true_rand( int n ) { int tab1[ n ]; int tab2[ n ]; int i; int j = 0; srand( time( NULL ) ); for( i = 0; i < n; i++ ) { tab1[ i ] = rand() % n + 1; } for( j = 0; j < n; j++ ) { for( i = - 1; i < n; i++ ) { if( tab1[ j ] == tab2[ i ] ) { tab1[ j ] = rand() % n + 1; i = - 1; } else if( tab1[ j ] != tab2[ i ] && i >= n - 1 ) { tab2[ j ] = tab1[ j ]; break; } } } for( i = 0; i < n; i++ ) { cout << tab2[ i ] << std::endl; } }
algorytm użyty bezpośrednio w funkcji main: #include <iostream> #include <time.h> #include <cstdlib> using std::cout; using std::cin; int main() { int tab1[ 18 ]; int tab2[ 18 ]; int i; int j = 0; srand( time( NULL ) ); for( i = 0; i < 18; i++ ) { tab1[ i ] = rand() % 18 + 1; } for( j = 0; j < 18; j++ ) { for( i = - 1; i < 18; i++ ) { if( tab1[ j ] == tab2[ i ] ) { tab1[ j ] = rand() % 18 + 1; i = - 1; } else if( tab1[ j ] != tab2[ i ] && i >= 17 ) { tab2[ j ] = tab1[ j ]; break; } } } for( int i = 0; i < 18; i++ ) { cout << tab2[ i ] << std::endl; } return 0; }
|
|
pekfos |
» 2019-11-28 18:27:39 Przekraczasz zakres tablicy i tab2 nie jest zainicjalizowane. Niby jak? Nie masz w tym kodzie niczego co by było prawdziwie losowe. Przeciwnie, twój generator jest nawet bardziej przewidywalny niż rand(). |
|
Lewy1607 Temat założony przez niniejszego użytkownika |
» 2019-11-28 18:45:34 W jaki sposób przekraczam niby zakres tablicy skoro bezspośrednio w funkcji main ten algorytm działa jak należy? czyli losuje liczby z przedziału od 1 do 18 i nie powtarzają się one ani razu?.I niby jak nie zainicjalizowałem tab2 jak zrobiłem to przecież na samym początku funkcji main? ( chodzi mi o ten drugi kod ). |
|
Lewy1607 Temat założony przez niniejszego użytkownika |
» 2019-11-28 18:51:10 Już nieważne - wiem w czym jest problem,w pętli zewnętrznej przekroczyłem zakres wykonywania pętli,bo powinien być on o 1 mniejszy niż ilość liczb w tablicy.Dziękuje za pomoc.Ale z tym niezainicjalizowaniem tab2 nadal nie wiem o co chodziło. Tak samo jak z tym,że - użyty algorytm w funkcji main działa dalej jak należy,a jak już go użyje w funkcji to się on sypie. ironicznie gdy użyje kod z funkcji bezpośrednio w funkcji main to z kolei ostatni indeks tablicy się sypie. Tutaj konkretne przykłady jeśli wyraziłem się niejasno ( bo sam nie mam pojęcia czemu tak się dzieje,a żadnego błędu nie widzę ). algorytm użyty bezpośrednio w funkcji main: #include <iostream> #include <time.h> #include <cstdlib> using std::cout; using std::cin; int main() { int tab1[ 18 ]; int tab2[ 18 ]; int i; int j = 0; srand( time( NULL ) ); for( i = 0; i < 18; i++ ) { tab1[ i ] = rand() % 18 + 1; } for( j = 0; j < 18 - 1; j++ ) { for( i = - 1; i < 18; i++ ) { if( tab1[ j ] == tab2[ i ] ) { tab1[ j ] = rand() % 18 + 1; i = - 1; } else if( tab1[ j ] != tab2[ i ] && i >= 18 - 1 ) { tab2[ j ] = tab1[ j ]; break; } } } for( int i = 0; i < 18; i++ ) { cout << tab2[ i ] << std::endl; } return 0; }
algorytm użyty w procedurze: #include <iostream> #include <cstdlib> #include <time.h> using std::cout; using std::cin; void true_rand( int n );
int main() { true_rand( 18 ); return 0; }
void true_rand( int n ) { int tab1[ n ]; int tab2[ n ]; int i; int j = 0; srand( time( NULL ) ); for( i = 0; i < n; i++ ) { tab1[ i ] = rand() % n + 1; } for( j = 0; j < n - 1; j++ ) { for( i = - 1; i < n; i++ ) { if( tab1[ j ] == tab2[ i ] ) { tab1[ j ] = rand() % n + 1; i = - 1; } else if( tab1[ j ] != tab2[ i ] && i >= n - 1 ) { tab2[ j ] = tab1[ j ]; break; } } } for( i = 0; i < n; i++ ) { cout << tab2[ i ] << std::endl; } }
|
|
pekfos |
» 2019-11-28 19:20:54 Przekraczasz zakres podając ujemny indeks. Ale z tym niezainicjalizowaniem tab2 nadal nie wiem o co chodziło. |
int tab2[ n ]; int i; int j = 0; srand( time( NULL ) ); for( i = 0; i < n; i++ ) { tab1[ i ] = rand() % n + 1; } for( j = 0; j < n; j++ ) { for( i = - 1; i < n; i++ ) { if( tab1[ j ] == tab2[ i ] )
|
|
Lewy1607 Temat założony przez niniejszego użytkownika |
» 2019-11-29 14:53:41 Rzeczywiście,musiałem przypisać do tab2 liczby,inaczej porównywałem liczby z adresami indeksów z tablicy. #include <iostream> #include <cstdlib> #include <time.h> using std::cout; using std::cin; void true_rand( int n );
int main() { true_rand( 18 ); return 0; }
void true_rand( int n ) { int tab1[ n ]; int tab2[ n ]; int i; int j = 0; srand( time( NULL ) ); for( i = 0; i < n; i++ ) { tab1[ i ] = rand() % n + 1; } for( i = n - 1; i >= 0; i-- ) { tab2[ i ] = tab1[ n - 1 ]; } for( j = 0; j < n - 1; j++ ) { for( i = 0; i < n; i++ ) { if( tab1[ j ] == tab2[ i ] ) { tab1[ j ] = rand() % n + 1; i = - 1; } else if( tab1[ j ] != tab2[ i ] && i >= n - 1 ) { tab2[ j ] = tab1[ j ]; break; } } } for( i = 0; i < n; i++ ) { cout << tab2[ i ] << std::endl; } }
Czy taki kod jest teraz prawidłowy? i czy przypisanie wartości i=-1 w pętli zgnieżdżonej, dalej powoduje przekroczeniu wartości? osobiście wydaje mi się że nie, bo po wykonaniu instrukcji if,pętla wykonuje instrukcję kroku "i" o 1 a więc pętla będzie się wtedy zaczynać znowu od 0. Czy dobrze Myślę? |
|
pekfos |
» 2019-11-29 19:21:17 Przypisanie -1 jest w porządku, tylko nie możesz zaczynać od -1. Czy taki kod jest teraz prawidłowy? |
A co on w ogóle ma robić? |
|
Lewy1607 Temat założony przez niniejszego użytkownika |
» 2019-11-30 09:26:51 A co on w ogóle ma robić? |
Losować liczby z określonego z góry przedziału od "1" do przedziału wpisanego przez użytkownika,które się nie powtarzają,czyli na 10 liczb,wylosują się liczby z przedziału od 1 do 10 i żadna z nich nie powtórzy się raz,czyli każda z tego przedziału wystąpić ma raz w losowej kolejności.Wydaje mi się że działa dobrze ale wolałbym spytać kogoś bardziej doświadczonego tak dla pewności czy nic się w nim już nie sypie. |
|
« 1 » 2 |