Gra w liczby - kłopot z zakresem

Gra w liczby - kłopot z zakresem
ST
  • Rejestracja:około 11 lat
  • Ostatnio:ponad 9 lat
  • Postów:56
0

Witam, mam do wykonania pewne zadanie o treści:

Gra w liczby. Użytkownik wymyśla jakąś liczbę całkowitą z przedziału od 0 do 500. Następnie komputer próbuje „zgadnąć” wymyśloną liczbę w następujący sposób: komputer pyta użytkownika czy jakaś (wygenerowana przez niego) liczba jest tą pomyślaną. Jeżeli tak to użytkownik wpisuje zero i aplikacja kończy się, jak pomyślana liczba jest mniejsza to użytkownik wprowadza 1, a jak większa to 2 i komputer pyta ponownie, aż do ustalenia pomyślanej liczby.
Napisz aplikację, która znajdzie wymyśloną liczbę przy najmniejszej liczbie zapytań.

Nie wiedzieć czemu, zakres po pierwszym losowaniu zmiejsza mi sie min = 2 i max = 2 a nie tak jak chce.
Proszę o jaką pomoc co z tym fantem zrobić.

Kod programu:

Kopiuj
 int twojaLiczba;
	int losowanie;  
    cout << "Podaj liczbe z zakresu od 0 do 500: ";
    cin >> twojaLiczba; 
    cout << "Twoja liczba to: " << twojaLiczba << endl; 
    
    int decyzja; 
    int min = 2;
    int max = 500;
	losowanie =  min + (int)(rand() / (RAND_MAX + 1.0) * max); 
	cout << "Wylosowana liczba: " << losowanie << endl; 
	cout << "Czy wylosowana liczba jest twoja liczba ? (TAK - 0)(Mniejsza - 1)(Wieksza - 2) " << endl; 
	cin >> decyzja; 
    while(true){
    	if(decyzja == 0){
    		return false; 
    	} else if(decyzja == 1){
    		min = losowanie;
    		cout << "Zakres min: "<< min << " i Zakres max: " << max ;
    		losowanie =  min + (int)(rand() / (RAND_MAX + 1.0) * max); 
			cout << "Wylosowana liczba: " << losowanie << endl; 
			cout << "Czy wylosowana liczba jest twoja liczba ? (TAK - 0)(Mniejsza - 1)(Wieksza - 2) " << endl; 
			cin >> decyzja; 	
    	} else if (decyzja == 2){
    		max = losowanie;
    		cout << "Zakres min: "<< min << " i Zakres max: " << max ;
    		losowanie =  min + (int)(rand() / (RAND_MAX + 1.0) * max); 
			cout << "Wylosowana liczba: " << losowanie << endl; 
			cout << "Czy wylosowana liczba jest twoja liczba ? (TAK - 0)(Mniejsza - 1)(Wieksza - 2) " << endl; 
			cin >> decyzja;
   		}
    
    }
ST
  • Rejestracja:około 11 lat
  • Ostatnio:ponad 9 lat
  • Postów:56
0
lisu1411 napisał(a):
Kopiuj
else if (decyzja == 2){
            max = losowanie;

do zmiennej max przypisujesz wartość losowanie i dlatego Ci tak wychodzi, moim zdaniem :)

robię tak, ponieważ z każdym obrotem pętli chce zmniejszyć zakres :)

twonek
  • Rejestracja:prawie 11 lat
  • Ostatnio:prawie 2 lata
  • Postów:2500
1
Kopiuj
losowanie =  min + (int)(rand() / (RAND_MAX + 1.0) * max);

rand() / (RAND_MAX + 1) zawsze zwraca 0;

Powinno być

Kopiuj
losowanie = min + rand() % (max - min);
edytowany 1x, ostatnio: twonek
ST
  • Rejestracja:około 11 lat
  • Ostatnio:ponad 9 lat
  • Postów:56
0
twonek napisał(a):
Kopiuj
losowanie =  min + (int)(rand() / (RAND_MAX + 1.0) * max);

rand() / (RAND_MAX + 1) zawsze zwraca 0;

Powinno być

Kopiuj
losowanie = min + rand() % (max - min);

teraz działa :) dziękuje :)

lisu1411
  • Rejestracja:ponad 10 lat
  • Ostatnio:ponad 8 lat
  • Lokalizacja:Biała
  • Postów:29
0
Kopiuj
losowanie =  min + (int)(rand() / (RAND_MAX + 1.0) * max);

przez to w pewnym momencie wychodzi poza zakres :/ np. dla zakresu od 2 do 7 losuje 8

ST
  • Rejestracja:około 11 lat
  • Ostatnio:ponad 9 lat
  • Postów:56
0
lisu1411 napisał(a):
Kopiuj
losowanie =  min + (int)(rand() / (RAND_MAX + 1.0) * max);

przez to w pewnym momencie wychodzi poza zakres :/ np. dla zakresu od 2 do 7 losuje 8

teraz jest tak i działa dobrze:

Kopiuj
losowanie = min + rand() % (max - min);
_13th_Dragon
  • Rejestracja:prawie 20 lat
  • Ostatnio:17 dni
3

losowanie = min + rand() % (max - min); - nigdy nie wylosuje max, powinno być: losowanie = min + rand() % (max - min + 1);


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
ST
  • Rejestracja:około 11 lat
  • Ostatnio:ponad 9 lat
  • Postów:56
0
_13th_Dragon napisał(a):

losowanie = min + rand() % (max - min); - nigdy nie wylosuje max, powinno być: losowanie = min + rand() % (max - min + 1);

nie widzę różnicy w działaniu programu, a też nie za bardzo jestem w stanie zrozumieć różnicy między tymi dwoma zapisami. (dlatego że jeszcze słabo znam rand)

edytowany 2x, ostatnio: storin
twonek
Bez poprawki @_13th_Dragon program nigdy nie zgadnie jeśli wybraleś na początku liczbę max bo największa wartość, jaką jest w stanie podać to max - 1
_13th_Dragon
  • Rejestracja:prawie 20 lat
  • Ostatnio:17 dni
2

Nie widzisz różnicy? To wybierz liczbę 500 ze swoją starą wersją.
Tak a propos piszesz: - "Podaj liczbe z zakresu od 0 do 500: " no to podaj 0 lub 1.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 1x, ostatnio: _13th_Dragon
ST
  • Rejestracja:około 11 lat
  • Ostatnio:ponad 9 lat
  • Postów:56
0

teraz rozumiem :) a tam zamiast 2 już zmieniłem na 0 (2 było żeby sprawdzić czy się zakres ustawia od tej zmiennej)

edytowany 1x, ostatnio: storin

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.