Rozdział 21. Losowanie bez powtórzeń (własna interpretacja zadania z kontekstu)
Ostatnio zmodyfikowano 2015-07-20 12:36
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.
#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
|
|
notabigthreat |
» 2015-07-20 11:43:33 Najpierw losuj, pozniej sprawdzaj. |
|
Dariuss_Smith Temat założony przez niniejszego użytkownika |
» 2015-07-20 11:52:21 tak właśnie robi : do { liczba = losuj(); if( load( liczba, wylosowane, aktualnieWylosowanych ) == false ) { wylosowane[ aktualnieWylosowanych ] == liczba; cout << "\nDla pozycji = " << aktualnieWylosowanych << " wylosowano " << liczba; aktualnieWylosowanych++; } } while( aktualnieWylosowanych < maxWylosowanych );
|
|
notabigthreat |
» 2015-07-20 11:56:39 No to raczej sie pomylilem. |
|
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: if( load( liczba, wylosowane, aktualnieWylosowanych ) == false ) { wylosowane[ aktualnieWylosowanych ] == liczba; cout << "\nDla pozycji = " << aktualnieWylosowanych << " wylosowano " << liczba; aktualnieWylosowanych++; }
wylosowane[ aktualnieWylosowanych ] == liczba;
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 |
|
jankowalski25 |
» 2015-07-20 12:23:08 <<deleted>> |
|
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 |
|
« 1 » |