Losowanie liczby z przedziału, poprzez dzielenie go na pół

0

Cześć, mam za zadanie znaleźć liczbę, którą sam sobie wpiszę, z przedziału <0;1000). Później muszę to porównać z liczbą, którą mi program wylosuje. Przedział ma się dzielić na pół od góry lub od dołu, w zależności czy liczba wylosowana będzie mniejsza czy większa. na razie napisałem coś takiego, ale utknąłem i nie wiem co dalej zrobić. Prosiłbym o małą pomoc w tym zakresie. Nie jestem pewien czy w ogóle idę w dobrą stronę.

#include <iostream>
#include <cstdlib>
using namespace std;

int main(int argc, char** argv) {
	int k, z, p;
	int g=999;
	int d=0;
	cout << "Podaj liczbe z przedzialu <0;1000)" << endl;
	cin >> k;
	
	while (k>999 || k<0)
	{
		cout << "Liczba ta nie miesci sie w przedziale. Sprobuj jeszcze raz\n";
		cin >> k;
	}
	
	while (z!=k)
	{
		z=rand()%(g-d+1)+d;
		p=g/2;
		if (p > k)
		{
			g=g/2;
		}
		else if (p < k)
		{
			d=p;
		}
	}
	cout<<"Wylosowana liczba: "<<z;
	return 0;
}
3

To program ma za pomocą losowania odgadnąć jaką liczbę wpisałeś, a nie odwrotnie?

Na pewno problemem jest to, że z jest użyte bez jakiejkolwiek inicjalizacji. Inicjalizuj swoje zmienne.

Co do samego rand(), lektura: https://dsp.krzaq.cc/post/180/nie-uzywaj-rand-cxx-ma-random/

0

Chodzi o to, że mam wpisać liczbę z przedziału, komputer poprzez losowanie z przedziału, który zmniejsza się w zależności od tego czy połowa danego przedziału jest większa czy mniejsza nić ta liczba, aż znajdzie ją. Nie jestem pewien co oznacza inicjalizowanie zmiennych w tym przypadku

0
    int k, z, p;
    int g=999;
    int d=0;
    cout << "Podaj liczbe z przedzialu <0;1000)" << endl;
    cin >> k;

    while (k>999 || k<0)
    {
        cout << "Liczba ta nie miesci sie w przedziale. Sprobuj jeszcze raz\n";
        cin >> k;
    }

    while (z!=k) // jaką wartość ma tu z?
0
kq napisał(a):
    int k, z, p;
    int g=999;
    int d=0;
    cout << "Podaj liczbe z przedzialu <0;1000)" << endl;
    cin >> k;

    while (k>999 || k<0)
    {
        cout << "Liczba ta nie miesci sie w przedziale. Sprobuj jeszcze raz\n";
        cin >> k;
    }

    while (z!=k) // jaką wartość ma tu z?

W tym wypadku nie ma żadnej, ale jak wyciągnę losowanie dla z to sama pętla mi nie zadziała. Czyli powinienem ustawić z=0 na początku??

0

W takim wypadku użyj pętli do while, albo zainicjalizuj zmienną. Nie możesz użyć zmiennych, które nie zostały zainicjalizowane.

0

Jeżeli użyję do while, to wyskakuje mi błąd, że przed końcowym wypisaniem oczekiwany jest while

0

No to zapraszam do kursu...

0

Okej, a co z tą częścią?

if (p > k)
        {
            g=g/2;
        }
        else if (p < k)
        {
            d=p;
        }

Nie jestem pewien czy dobrze ucinam przedziały tak, żeby się coraz bardziej zawężały do danej liczby

0

Chyba. Szkoda, że stosujesz tak nieczytelne nazwy zmiennych.

0

k - szukana liczba, g - górna granica, d - dolna granica, p - połowa przedziału. Widzę już, że mam błąd w miejscu, gdzie p to po prostu połowa górnej granicy, a powinna być połowa przedziału u mnie.

1

Pisanie legenndy jest bardzo dobrym przykładem bardzo złych nazw.

0
YooSy napisał(a):

Pisanie legenndy jest bardzo dobrym przykładem bardzo złych nazw.

Mam mały program, do tego jest to zadanie, gdzie każdy ma takie same nazwy, dlatego ich używam.

Wracając do tematu głównego to chyba zrobiłem.```
#include <iostream>
#include <cstdlib>
using namespace std;

int main(int argc, char** argv) {
int k, z, p;
int g=999;
int d=0;
cout << "Podaj liczbe z przedzialu <0;1000)" << endl;
cin >> k;

while (k>999 || k<0)
{
	cout << "Liczba ta nie miesci sie w przedziale. Sprobuj jeszcze raz\n";
	cin >> k;
}

do 
{
	z=rand()%(g-d+1)+d;
	cout<<z<<"  ";
	p=(g-d)/2+d;
	if (p > k)
	{
		g=p;
	}
	else if (p < k)
	{
		d=p;
	}
}
while (z!=k);

while  (z == k)
{
cout<<"Wylosowana liczba: "<<z;
break;
}
return 0;

}

0

Magiczne liczby też nie są w dobrym tonie. Zapamiętaj je w jakichś nazwanych stałych.

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