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

[Kurs] Losowanie bez powtórzeń- dziwne liczby

Ostatnio zmodyfikowano 2014-03-20 18:42
Autor Wiadomość
mati220
Temat założony przez niniejszego użytkownika
[Kurs] Losowanie bez powtórzeń- dziwne liczby
» 2014-03-14 20:58:34
Witam. Napisałem program losowania bez powtórzeń. Wszystko działa jak trzeba, liczby losują się z przedziału od 1 do 10 i nie powtarzają się. Jednak nieraz jak uruchamiam program pokazują się jakieś dziwne liczby chociaż zadeklarowałem że mają być losowane z przedziału od 1 do 10.

Kod:
C/C++
#include<iostream>
#include<ctime>
#include<cstdlib>
using namespace std;

int losowanie()
{
    return( rand() % 10 ) + 1;
}

int sprawdzanie( int liczba, int liczby[], int ile )
{
    int i = 0;
    if( ile == 0 )
         return false;
   
    do
    {
        if( liczby[ i ] == liczba )
             return true;
       
        i++;
    }
    while( i < 5 );
   
    return false;
}

int wypisywanie( int liczby[], int ile )
{
    int a = 1;
    ile = 0;
    do
    {
        cout << "Liczba " << a << " to: " << liczby[ ile ] << endl;
        a++;
        ile++;
    }
    while( ile < 5 );
   
}
int main()
{
    srand( time( 0 ) );
    int liczba, ile = 0;
    int liczby[ 5 ];
    cout << "Losowanie liczb bez powtorzen" << endl;
    do
    {
        liczba = losowanie();
        if( sprawdzanie( liczba, liczby, ile ) == false )
             liczby[ ile ] = liczba;
       
        ile++;
    }
    while( ile < 5 );
   
    wypisywanie( liczby, ile );
    return 0;
}
P-106370
MrPoxipol
» 2014-03-14 21:12:06
pokazują się jakieś dziwne liczby
Jakie?
P-106372
mati220
Temat założony przez niniejszego użytkownika
» 2014-03-15 20:14:23
Typu "2293512", "1982172373" itp.
Ewentualnie sam możesz sprawdzić jeśli masz kompilator.
P-106479
SeaMonster131
» 2014-03-15 20:26:16
C/C++
do
{
    liczba = losowanie();
    if( sprawdzanie( liczba, liczby, ile ) == false )
         liczby[ ile ] = liczba;
   
    ile++;
}
while( ile < 5 );

Jeżeli dana liczba istnieje już w tablicy, to powtórz losowanie.
P-106482
mati220
Temat założony przez niniejszego użytkownika
» 2014-03-19 20:48:13
Teraz mam pytanie apropo:
1. Napisz program, który wczyta 3 liczby podane przez użytkownika do tablicy, a następnie wylosuje 2 z nich bez powtórzeń. Wynik wypisz na ekran. Postaraj się napisać ten program w oparciu o funkcje.

Próbowałem i normalnie losowało tyle że czasami się powtarzały. Doszedłem do takiego czegoś i teraz albo nie wykonuje się ani razu albo wywala program.
Jakieś pomysły?


C/C++
#include<iostream>
#include<ctime>
#include<cstdlib>
using namespace std;

int dodawanie_liczb( int liczby[], int wiela )
{
    int x = 1;
    do
    {
        cout << "Podaj " << x << " liczbe: " << endl;
        cin >> liczby[ wiela ];
        wiela++;
        x++;
    }
    while( wiela < 3 );
   
    return liczby[ wiela ];
}

int losowanie()
{
    return( rand() % 3 ) + 0;
}

int sprawdzanie( int liczba[], int ile, int i )
{
    int wiela = 0;
    if( ile == 0 )
         return false;
   
    do
    {
        if( liczba[ i ] == liczba[ wiela ] )
             return true;
       
        wiela++;
    }
    while( wiela < 3 );
   
    return false;
}

int wypisywanie( int liczby[], int liczba[], int wiela, int ile )
{
    int a = 1;
    wiela = 0;
    ile = 0;
    do
    {
        ile = liczba[ wiela ];
        cout << "Liczba " << a << " to: " << liczby[ ile ] << endl;
        a++;
        wiela++;
    }
    while( wiela < 2 );
   
}
int main()
{
    srand( time( 0 ) );
    int liczba[ 2 ], ile = 0, wiela = 0, i = 0, d = 0;
    int liczby[ 3 ];
   
    dodawanie_liczb( liczby, wiela );
    do
    {
        d = losowanie(); // losuje numer tablicy liczb
        if( sprawdzanie( liczba, ile, i ) == false )
        {
            liczba[ wiela ] = d;
            i++;
            ile++;
            wiela++;
        }
       
    }
    while( ile < 3 );
   
    wypisywanie( liczby, liczba, wiela, ile );
    return 0;
}
P-106816
OczkoSX
» 2014-03-19 22:12:32
Nie przeglądałem kodu, ale mogę ci poradzić abyś zmienne przekazywał przez referencję. Wtedy bazujesz na oryginalnej zmiennej a nie na jej kopii. No i oczywiście nie musisz tworzyć zmiennej czasowej więc nie marnujesz tylu zasobów komputera. Jeśli coś ci nie działa to jeśli twoje IDE to obsługuje (np. jest to w Visual'u), to włącz krokowanie, analizujesz działanie programu krok po kroku co umożliwia podgląd w którym miejscu, i gdzie jest błąd ;)
P-106821
libed
» 2014-03-20 18:42:35
C/C++
#include <iostream>
#include <ctime>
#include <cstdlib>

const unsigned int rozmiar = 3;

void dodaj_liczby( int tab[] ) {
    for( unsigned int i = 0; i < rozmiar; ++i ) {
        std::cout << "Podaj " << i + 1 << " liczbe: ";
        std::cin >> tab[ i ];
    }
}

void wypisz_liczbe( int liczba ) {
    std::cout << "Wylosowana liczba: " << liczba << "\n";
}

int losuj() {
    return rand() % 3;
}

bool jeszcze_nie_bylo( int liczba, int & poprzednia ) {
    if( liczba == poprzednia )
         return false;
   
    poprzednia = liczba;
    return true;
}


int main( int argc, char ** argv ) {
    srand( time( NULL ) );
    int tablica[ rozmiar ] = { 0 };
    dodaj_liczby( tablica );
    int wylosowano = 0, pierwsza = - 1;
    while( wylosowano != 2 ) {
        int indeks = losuj();
        if( jeszcze_nie_bylo( tablica[ indeks ], pierwsza ) ) {
            wypisz_liczbe( tablica[ indeks ] );
            wylosowano++;
        }
    }
    return 0;
}
P-106862
« 1 »
  Strona 1 z 1