021995 Temat założony przez niniejszego użytkownika |
Zapis różnych (nie powtarzających się) liczb w tablicy » 2010-07-19 04:07:39 Witam
tytuł może i ma nietypową nazwę ale nie ma tego jak krótko zapisać
problem mam taki że nie wiem jak zapisać żeby w tablicy nie powtarzały się wylosowane liczby funkcją rand()
z góry dzięki za pomoc
aha napisałem posta parę minut temu ale coś ostatnio ddt wolno chodzi i jak dodałem temat to nie wyświetliła się ani nazwa tematu kiedy otwarcie cpp0x ? :] bo moim zdaniem ddt to krótsza domena i lepiej pasuję :] |
|
MAKONDE |
» 2010-07-19 10:49:01 myślę że można zrobić drugą tablice do której wylosować liczby i zobaczyć czy są równe...nie wiem czy będzie działało...właśnie sprawdzam :P |
|
wojos |
» 2010-07-19 11:39:03 Pamiętam, że kiedyś borykałem się z tym samym problemem i wpadłem na pomysł, żeby przed każdym losowaniem wywoływać funkcję srand z czasu pomnożonego przez pewien współczynnik: int LiczbaLosowa( int Min, int Max, int Wsp ) { srand( static_cast < unsigned int >( time( NULL ) * Wsp ) ); int Wynik =( rand() %( Max - Min + 1 ) + Min ); return Wynik; }
A tu przykład jak można skorzystać z tego w programie: #include <iostream> #include <ctime> #include <cstdlib>
using namespace std;
int LiczbaLosowa( int Min, int Max, int Wsp ) { srand( static_cast < unsigned int >( time( NULL ) * Wsp ) ); int Wynik =( rand() %( Max - Min + 1 ) + Min ); return Wynik; }
int main() { int tab[ 5 ]; for( int i = 0; i < 5; i++ ) { tab[ i ] = LiczbaLosowa( 1, 100, i + 1 ); } for( int i = 0; i < 5; i++ ) { cout << "Liczba" << i + 1 << ": " << tab[ i ] << endl; } return 0; }
Można ten program skompilować i sprawdzić, że działa. Tak czy owak jest to tylko mój pomysł na rozwiązanie problemu i nie mogę powiedzieć czy jest to najwydajniejszy sposób. EDIT: Korzystając jednak z tego sposobu trzeba uważać, żeby nie skorzystać z współczynnika równego 0 bo wtedy za każdym razem wynik losowanej liczby będzie taki sam :P Dlatego albo w funkcji LosowaLiczba trzeba zastosować odpowiedni chwyt zapobiegający użyciu 0 lub po prostu nigdy 0 nie używać w kodzie (to pierwsze chyba lepsze :P). |
|
lenrokskate |
» 2010-07-19 12:42:11 może lepiej przez rekurencję? int LiczbaLosowa( int Min, int Max, int Wsp, int * tablica ) { int rozmiar = sizeof( tablica ); static int ifor; srand( static_cast < unsigned int >( time( NULL ) * Wsp ) ); int Wynik =( rand() %( Max - Min + 1 ) + Min ); ifor++; if( ifor < rozmiar ) { LiczbaLosowa( Min, Max, Wsp + 1, tablica ); } }
zaraz sprawdzę czy działa |
|
VND |
» 2010-07-19 12:56:43 Zmiana współczynnika w żadnym wypadku nie zabezpiecza przed ponownym wylosowaniem tej samej wartości. Powoduje tylko losowanie innego zestawu liczb, ale nie ma nic wspólnego z powtarzalnością. Przekonasz się o tym gdy zmniejszysz zakres losowanych liczb, teraz ciężko jest trafić dwie takie same w przedziale 1-100. Jedynym wyjściem jest sprawdzać już wylosowane liczby, jeśli już była ponowić losowanie i tak aż do skutku. #include <cstdlib> #include <iostream> #include <ctime> using namespace std;
int tabela[ 10 ];
bool juz_byla( int n, int ilosc ) { for( int i = 0; i < ilosc; ++i ) { if( tabela[ i ] == n ) return true; } return false; } int main() { srand( time( NULL ) ); int los, licznik = 0; while( licznik < 10 ) { los = rand() % 20; if( !juz_byla( los, licznik ) ) { tabela[ licznik ] = los; licznik++; } } for( int i = 0; i < 10; i++ ) { cout << tabela[ i ] << endl; } return 0; }
|
|
wojos |
» 2010-07-19 13:17:56 Nie zabezpiecza natomiast korzystając z czasu mnożonego współczynnik powoduje się rzeczywistą różnorodność liczb, jeżeli wylosujemy całą tablicę w jednej pętli for bez współczynnika to procesor zrobi to tak szybko, że czas nawet nie zdąrzy się zmienić. Dlatego usuwając współczynnik z mojego kodu wszystkie 5 liczb będzie takie same (np. 90, 90, 90, 90, 90; rzadko ale jednak może zdarzyć się np. taka sytuacja: 90, 90, 90, 91, 91). Można zastosować mechanizm sprawdzający czy się nie powtarza liczba i to jest oczywiste pod warunkiem, że tego chcemy. Tak też zrobiłem we własnym projekcie gdy go tworzyłem. Natomiast tutaj pisałem tylko o sposobie zróżnicowania wyników.
EDIT: a z losowaniem aż do skutku też próbowałem ale powodowało tylko strasznie powolną pracę programu. |
|
021995 Temat założony przez niniejszego użytkownika |
» 2010-07-19 14:54:08 Liczba1: 3 Liczba2: 3 Liczba3: 3 Liczba4: 2 Liczba5: 3 Liczba6: -858993460 Liczba7: 281102953 Liczba8: 1245112 Liczba9: 4270223
:]
#edit
dzięki wszystkim ten kod wojas'a źle losował ;] bo się liczby powtarzały :] dzięki za pomoc |
|
« 1 » |