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

Losowanie bez powtórzeń

Ostatnio zmodyfikowano 2013-12-18 16:00
Autor Wiadomość
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ń?
C/C++
#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 );
   
   
}


P-99520
DejaVu
» 2013-12-17 20:44:17
Najprościej użyć std::shuffle.

http://en.cppreference.com/w​/cpp/algorithm/random_shuffle

C/C++
#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";
}
P-99522
leon_w
» 2013-12-17 20:44:36
P-99523
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
P-99559
pekfos
» 2013-12-18 13:02:34
P-99562
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
C/C++
#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++;
        } //if
    } while( wylosowanych < 2 );
   
    wylosowanych = 0;
    do
    {
        cout << "wartosc wylosowanej karty to " << wylosowane[ wylosowanych ] << endl;
        wylosowanych++;
    } while( wylosowanych < 2 );
   
    return 0;
   
}
P-99573
MrPoxipol
» 2013-12-18 16:00:33
Czemu nie zrobisz tego tak jak DV napisał?
P-99574
« 1 »
  Strona 1 z 1