Wątek przeniesiony 2015-03-19 13:08 z C/C++ przez ŁF.

Metoda bool jako warunek w petli while

0
do
{
	cout<<"jestem w while ";
}while(kupon1.losowanie()==false);

Mam metode bool losowanie ktora zwraca wartosc true lub false, jeśli zwróci false chciałbym, żeby została ponownie wywołana metoda aż do zwrócenia true.

Postanowiłem użyć do while tylko dlaczego teraz jeśli podam ją jako argument to wykonuję tę metodę?

To by było jeszcze pół biedy, przy true wykonuje się poprawnie, natomiast przy false dupluje się po 100 razy

bool Duzylotek::losowanie()
	{
			srand((unsigned)time(0)); 
			
			cout<<"Wylosowane liczby to  ";
			for(int i=0; i<6; i++) 
			{
	
				los[i]=rand()%16+1;
				cout<<los[i]<<" ";
			}
			cout<<endl;
			//zabezpieczenie przed tym samym losowaniem
			for(int i=0; i<5; i++) 		//JESLI I=0 a J=1 to w koncowce I=4 a J=5
			{
				for(int j=i+1; j<6; j++)	//j i+1 poniewaz po wyjsciu z petli od J zacznie sprawdzac 1==1 zamiast (1==2 || 1==i+1)
				{
					if(los[i]==los[j]) return false;
				}
			} //-------------------------------------------
										return true;
	}
4

Nie patrzylem dokladnie na implementacje losowania, ale juz po pierwszej linii widze oczywisty blad - nie wiem czy jedyny.

srand((unsigned)time(0));
wykonuje sie raz na poczatku programu, a nie za kazdym razem jak losujesz. Jesli uzyjesz przed kazdym losowaniem to przez pelna milisekunde bedziesz dostawal takie same wyniki, czyli de facto moze byc to bardzo duzo takich samych wynikow jesli w petli while.

Swoja droga:

while (x == false) {}

jest jednoznaczne z:

while (!x) {}

tak samo:

while (x == true) {}

jest jednoznaczne z:

while (x) {}
3

Tak jak mówi @krwq, w złym miejscu wywołujesz srand, tak w ogóle rand niedługo będzie deprecated, użyj <random>

 
#include <iostream>
#include <random>
#include <limits>
#include <chrono>
using namespace std;
int main() 
{

	unsigned seed = std::chrono::system_clock::now().time_since_epoch().count();
  	std::default_random_engine generator (seed);
  	std::uniform_int_distribution<int> distribution(0,std::numeric_limits<int>::max());
  	int number;
  	for(size_t i=0;i<50;++i)
  	{
  		number = distribution(generator);
  		cout << number << endl;
  	}
	return 0;
}

https://ideone.com/69YP85

Postanowiłem użyć do while tylko dlaczego teraz jeśli podam ją jako argument to wykonuję tę metodę?

Przy każdym sprawdzeniu warunku wywołuje sie ta metoda, jeśli chcesz żeby to działo sie tylko raz - przed pętlą zapisz sobie wynik losowanie() do boola.

1 użytkowników online, w tym zalogowanych: 0, gości: 1