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

Rozdział 21. Losowanie bez powtórzeń (własna interpretacja zadania z kontekstu)

Ostatnio zmodyfikowano 2015-07-20 12:36
Autor Wiadomość
Dariuss_Smith
Temat założony przez niniejszego użytkownika
Rozdział 21. Losowanie bez powtórzeń (własna interpretacja zadania z kontekstu)
» 2015-07-20 11:23:32
Napisałem od nowa własną wersję zadania którego rozwiązanie było w kontekście Rozdziału 21.
Niestety, liczby losowane wciąż się powtarzają.
Parę osób już przejrzało mój kod i nikt nie zauważył żadnych nieprawidłowości (powinien wykonać swoją robotę poprawnie).

Byłbym wielce rad jakby ktoś bardziej doświadczony mógł spojrzeć na ten kod i wskazać gdzie jest błąd.

C/C++
// made by Kowal

#include <iostream>
#include <ctime>
#include <cstdlib>

using namespace std;

bool load( int liczba, int wylosowane[], int aktualnieWylosowanych )
{
   
    if( aktualnieWylosowanych == 0 ) { return false; }
   
    int pozycjaSprawdzana = 0;
   
    do
    {
        if( wylosowane[ pozycjaSprawdzana ] == liczba ) { return true; }
        if( pozycjaSprawdzana == 0 ) { cout << endl; }
       
        cout << "\nPozycja " << pozycjaSprawdzana << " sprawdzona";
        pozycjaSprawdzana++;
       
       
    } while( pozycjaSprawdzana < aktualnieWylosowanych );
   
    return false;
}

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

int main()
{
    srand( time( NULL ) );
   
    int wylosowane[ 5 ];
    int maxWylosowanych = 5;
    int aktualnieWylosowanych = 0;
   
    int liczba;
   
    do
    {
       
        liczba = losuj();
       
        if( load( liczba, wylosowane, aktualnieWylosowanych ) == false )
        {
            wylosowane[ aktualnieWylosowanych ] == liczba;
            cout << "\nDla pozycji = " << aktualnieWylosowanych << " wylosowano " << liczba;
           
            aktualnieWylosowanych++;
           
        }
       
    } while( aktualnieWylosowanych < maxWylosowanych );
   
   
    cout << endl << endl;
    system( "pause" );
    return( 0 );
}


Przykładowy efekt skompilowanego programu:

Log kompilacji niżej \/



Dla pozycji = 0 wylosowano 4

Pozycja 0 sprawdzona
Dla pozycji = 1 wylosowano 8

Pozycja 0 sprawdzona
Pozycja 1 sprawdzona
Dla pozycji = 2 wylosowano 7

Pozycja 0 sprawdzona
Pozycja 1 sprawdzona
Pozycja 2 sprawdzona
Dla pozycji = 3 wylosowano 9

Pozycja 0 sprawdzona
Pozycja 1 sprawdzona
Pozycja 2 sprawdzona
Pozycja 3 sprawdzona
Dla pozycji = 4 wylosowano 8

Aby kontynuować, naciśnij dowolny klawisz . . .

Pomimo, że na pozycji "1" ( tablica[1] ) jest już '8' to na pozycji "4" ( tablica[4] ) wstawia ponownie wylosowaną '8'.

Kompilacja wykonana bezproblemowo:

Compiling single file...
--------
- Filename: C:\Users\Dariuss Smith\Desktop\powtarzane losowe.cpp
- Compiler Name: TDM-GCC 4.9.2 64-bit Release

Processing C++ source file...
--------
- C++ Compiler: D:\Programy\Dev-Cpp\MinGW64\bin\g++.exe
- Command: g++.exe "C:\Users\Dariuss Smith\Desktop\powtarzane losowe.cpp" -o "C:\Users\Dariuss Smith\Desktop\powtarzane losowe.exe"  -I"D:\Programy\Dev-Cpp\MinGW64\include" -I"D:\Programy\Dev-Cpp\MinGW64\x86_64-w64-mingw32\include" -I"D:\Programy\Dev-Cpp\MinGW64\lib\gcc\x86_64-w64-mingw32\4.9.2\include" -I"D:\Programy\Dev-Cpp\MinGW64\lib\gcc\x86_64-w64-mingw32\4.9.2\include\c++" -L"D:\Programy\Dev-Cpp\MinGW64\lib" -L"D:\Programy\Dev-Cpp\MinGW64\x86_64-w64-mingw32\lib" -static-libgcc

Compilation results...
--------
- Errors: 0
- Warnings: 0
- Output Filename: C:\Users\Dariuss Smith\Desktop\powtarzane losowe.exe
- Output Size: 1,83384323120117 MiB
- Compilation Time: 0,66s








P-134949
notabigthreat
» 2015-07-20 11:43:33
Najpierw losuj, pozniej sprawdzaj.
P-134951
Dariuss_Smith
Temat założony przez niniejszego użytkownika
» 2015-07-20 11:52:21
tak właśnie robi :

C/C++
do
{
   
    liczba = losuj(); //1. pierw losuje
   
    if( load( liczba, wylosowane, aktualnieWylosowanych ) == false ) //2. Sprawdza czy taka jest
   
    {
        wylosowane[ aktualnieWylosowanych ] == liczba;
        cout << "\nDla pozycji = " << aktualnieWylosowanych << " wylosowano " << liczba;
       
        aktualnieWylosowanych++;
       
    } //3.  jeżeli jest to if się nie wykona i losuje jeszcze raz dla tego samego elementu tablicy
   
} while( aktualnieWylosowanych < maxWylosowanych );

/* będzie klepać tyle razy pętle aż if nie wykona się odpowiednią ilość razy */
P-134952
notabigthreat
» 2015-07-20 11:56:39
No to raczej sie pomylilem.
P-134953
Dariuss_Smith
Temat założony przez niniejszego użytkownika
» 2015-07-20 12:07:35
ciekawe...
Sam sobie znalazłem błąd.
Ale że musiałem to tutaj wstawić by to zauważyć ;p

Cały problem sprawiał zapis:

C/C++
if( load( liczba, wylosowane, aktualnieWylosowanych ) == false )
{
    wylosowane[ aktualnieWylosowanych ] == liczba;
    cout << "\nDla pozycji = " << aktualnieWylosowanych << " wylosowano " << liczba;
   
    aktualnieWylosowanych++;
   
}

C/C++
wylosowane[ aktualnieWylosowanych ] == liczba;

// a powinno być :

wylosowane[ aktualnieWylosowanych ] = liczba;

Teraz już działa, została tylko estetyka



Dla pozycji = 0 wylosowano 5

Pozycja 0 sprawdzona
Dla pozycji = 1 wylosowano 9

Pozycja 0 sprawdzona
Pozycja 1 sprawdzona
Dla pozycji = 2 wylosowano 1

Pozycja 0 sprawdzona
Pozycja 1 sprawdzona
Pozycja 2 sprawdzona
Dla pozycji = 3 wylosowano 4

Pozycja 0 sprawdzona
Pozycja 1 sprawdzona

Pozycja 0 sprawdzona
Pozycja 1 sprawdzona
Pozycja 2 sprawdzona
Pozycja 3 sprawdzona
Dla pozycji = 4 wylosowano 10

Aby kontynuować, naciśnij dowolny klawisz . . .


I wszystko tylko dlatego, że dałem dwa znaki zamiast jednego ;p

P-134954
jankowalski25
» 2015-07-20 12:23:08
<<deleted>>
P-134956
Dariuss_Smith
Temat założony przez niniejszego użytkownika
» 2015-07-20 12:36:45
Po poprawce :



Dla pozycji = 0 wylosowano 4
Dla pozycji = 1 wylosowano 8
Dla pozycji = 2 wylosowano 2
Dla pozycji = 3 wylosowano 10
Dla pozycji = 4 wylosowano 9


Aby kontynuować, naciśnij dowolny klawisz . . .


ZAMYKAM
P-134959
« 1 »
  Strona 1 z 1