Losowanie bez powtórzeń
Ostatnio zmodyfikowano 2013-12-18 16:00
Reno_pies Temat założony przez niniejszego użytkownika |
Losowanie bez powtórzeń » 2013-12-17 20:39:22 Witam Mam następujący problem, napisałem program, który losuje liczby z tablicy. Co mam zrobić aby program ten losował liczby bez powtórzeń? #include <iostream> #include <conio.h> #include <stdlib.h> #include <ctime> using namespace std; int main() { int i = 0; int t[ 52 ]; t[ 0 ] = 2; t[ 1 ] = 2; t[ 2 ] = 2; t[ 3 ] = 2; t[ 4 ] = 3; t[ 5 ] = 3; t[ 6 ] = 3; t[ 7 ] = 3; t[ 8 ] = 4; t[ 9 ] = 4; t[ 10 ] = 4; t[ 11 ] = 4; t[ 12 ] = 5; t[ 13 ] = 5; t[ 14 ] = 5; t[ 15 ] = 5; t[ 16 ] = 6; t[ 17 ] = 6; t[ 18 ] = 6; t[ 19 ] = 6; t[ 20 ] = 7; t[ 21 ] = 7; t[ 22 ] = 7; t[ 23 ] = 7; t[ 24 ] = 8; t[ 25 ] = 8; t[ 26 ] = 8; t[ 27 ] = 8; t[ 28 ] = 9; t[ 29 ] = 9; t[ 30 ] = 9; t[ 31 ] = 9; t[ 32 ] = 10; t[ 33 ] = 10; t[ 34 ] = 10; t[ 35 ] = 10; t[ 36 ] = 2; t[ 37 ] = 2; t[ 38 ] = 2; t[ 39 ] = 2; t[ 40 ] = 3; t[ 41 ] = 3; t[ 42 ] = 3; t[ 43 ] = 3; t[ 44 ] = 4; t[ 45 ] = 4; t[ 46 ] = 4; t[ 47 ] = 4; t[ 48 ] = 11; t[ 49 ] = 11; t[ 50 ] = 11; t[ 51 ] = 11; int wybor; cout << "witaj w grze Oczko" << endl; srand( time( NULL ) ); for( int y = 0; y < 2; y++ ) { t[ y ] = rand() %( t[ 0 ] - t[ 51 ] ) + t[ 0 ]; cout << "Wartosc wylosowanej karty to :" << t[ y ] << endl; cout << "*********************************" << endl; } for( int j = 0; j < 2; j++ ) { i = i + t[ j ]; } cout << "Suma wartosci kart wynosi: " << i << endl; if( i == 21 ) { cout << "BLACK JACK" << endl; return 0; } if( i > 21 ) { cout << "wartosc obu kart przekracza 21" << endl; return 0; } cout << "[1] dobierz karte [2] pozostan przy wylosowanych kartach" << endl; cin >> wybor; do { int t[ 52 ]; t[ 0 ] = 2; t[ 1 ] = 2; t[ 2 ] = 2; t[ 3 ] = 2; t[ 4 ] = 3; t[ 5 ] = 3; t[ 6 ] = 3; t[ 7 ] = 3; t[ 8 ] = 4; t[ 9 ] = 4; t[ 10 ] = 4; t[ 11 ] = 4; t[ 12 ] = 5; t[ 13 ] = 5; t[ 14 ] = 5; t[ 15 ] = 5; t[ 16 ] = 6; t[ 17 ] = 6; t[ 18 ] = 6; t[ 19 ] = 6; t[ 20 ] = 7; t[ 21 ] = 7; t[ 22 ] = 7; t[ 23 ] = 7; t[ 24 ] = 8; t[ 25 ] = 8; t[ 26 ] = 8; t[ 27 ] = 8; t[ 28 ] = 9; t[ 29 ] = 9; t[ 30 ] = 9; t[ 31 ] = 9; t[ 32 ] = 10; t[ 33 ] = 10; t[ 34 ] = 10; t[ 35 ] = 10; t[ 36 ] = 2; t[ 37 ] = 2; t[ 38 ] = 2; t[ 39 ] = 2; t[ 40 ] = 3; t[ 41 ] = 3; t[ 42 ] = 3; t[ 43 ] = 3; t[ 44 ] = 4; t[ 45 ] = 4; t[ 46 ] = 4; t[ 47 ] = 4; t[ 48 ] = 11; t[ 49 ] = 11; t[ 50 ] = 11; t[ 51 ] = 11; for( int y = 0; y < 1; y++ ) { t[ y ] = rand() %( t[ 0 ] - t[ 51 ] ) + t[ 0 ]; cout << "Wartosc wylosowanej karty to :" << t[ y ] << endl; } for( int j = 0; j < 1; j++ ) { i = i + t[ j ]; } cout << "Suma wartosci kart wynosi: " << i << endl; if( i == 21 ) { cout << "BLACK JACK" << endl; return 0; } if( i > 21 ) { cout << "wartosc obu kart przekracza 21 " << endl; return 0; } cout << "[1] dobierz karte [2] pozostan przy wylosowanych kartach" << endl; cin >> wybor; } while( wybor == 1 ); }
|
|
DejaVu |
» 2013-12-17 20:44:17 Najprościej użyć std::shuffle. http://en.cppreference.com/w/cpp/algorithm/random_shuffle#include <random> #include <algorithm> #include <iterator> #include <iostream>
int main() { std::vector < int > v = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; std::random_device rd; std::mt19937 g( rd() ); std::shuffle( v.begin(), v.end(), g ); copy( v.begin(), v.end(), std::ostream_iterator < int >( std::cout, " " ) ); std::cout << "\n"; }
|
|
leon_w |
» 2013-12-17 20:44:36 |
|
Reno_pies Temat założony przez niniejszego użytkownika |
» 2013-12-18 11:44:09 Nie można zrobić tego w inny łatwiejszy sposób, ucze się programowania niecałe dwa miesiące i jeszcze nie wszystko jest dla mnie jasne |
|
pekfos |
» 2013-12-18 13:02:34 |
|
Reno_pies Temat założony przez niniejszego użytkownika |
» 2013-12-18 15:56:36 Napisałem coś takiego. Program nie powtarza liczb ale chodziło aby nie powtarzał elementów z tablicy #include <iostream> #include <cstdlib> #include <ctime> using namespace std; bool czyBylaWylosowana( int iLiczba, int tab[], int ile ) { if( ile <= 0 ) return false; int i = 0; do { if( tab[ i ] == iLiczba ) return true; i++; } while( i < ile ); return false; }
int wylosuj() { int t[ 52 ]; t[ 0 ] = 2; t[ 1 ] = 2; t[ 2 ] = 2; t[ 3 ] = 2; t[ 4 ] = 3; t[ 5 ] = 3; t[ 6 ] = 3; t[ 7 ] = 3; t[ 8 ] = 4; t[ 9 ] = 4; t[ 10 ] = 4; t[ 11 ] = 4; t[ 12 ] = 5; t[ 13 ] = 5; t[ 14 ] = 5; t[ 15 ] = 5; t[ 16 ] = 6; t[ 17 ] = 6; t[ 18 ] = 6; t[ 19 ] = 6; t[ 20 ] = 7; t[ 21 ] = 7; t[ 22 ] = 7; t[ 23 ] = 7; t[ 24 ] = 8; t[ 25 ] = 8; t[ 26 ] = 8; t[ 27 ] = 8; t[ 28 ] = 9; t[ 29 ] = 9; t[ 30 ] = 9; t[ 31 ] = 9; t[ 32 ] = 10; t[ 33 ] = 10; t[ 34 ] = 10; t[ 35 ] = 10; t[ 36 ] = 2; t[ 37 ] = 2; t[ 38 ] = 2; t[ 39 ] = 2; t[ 40 ] = 3; t[ 41 ] = 3; t[ 42 ] = 3; t[ 43 ] = 3; t[ 44 ] = 4; t[ 45 ] = 4; t[ 46 ] = 4; t[ 47 ] = 4; t[ 48 ] = 11; t[ 49 ] = 11; t[ 50 ] = 11; t[ 51 ] = 11; return rand() %( t[ 0 ] - t[ 51 ] ) + t[ 0 ]; } int main() { srand( time( 0 ) ); int wylosowane[ 2 ]; int wylosowanych = 0; do { int liczba = wylosuj(); if( czyBylaWylosowana( liczba, wylosowane, wylosowanych ) == false ) { wylosowane[ wylosowanych ] = liczba; wylosowanych++; } } while( wylosowanych < 2 ); wylosowanych = 0; do { cout << "wartosc wylosowanej karty to " << wylosowane[ wylosowanych ] << endl; wylosowanych++; } while( wylosowanych < 2 ); return 0; } |
|
MrPoxipol |
» 2013-12-18 16:00:33 Czemu nie zrobisz tego tak jak DV napisał? |
|
« 1 » |