Losowanie liczb z zakresu 100-999

0

Czy dobrze napisałem parametry przy funkcji rand(), chodzi o to by losowane liczby były z zakresu 100 - 999 włącznie

 int liczba = rand() % 100 + 900;
0

teraz masz od 900 do 999

0

Ty tak poważnie? Losujesz coś i dodajesz do tego 900. Jak chcesz uzyskać coś mniejszego od 900?

0
Shalom napisał(a):

Ty tak poważnie? Losujesz coś i dodajesz do tego 900. Jak chcesz uzyskać coś mniejszego od 900?

liczby ujemne?

0

Poprawiam:

 int liczba = rand() % 900 + 100
2

Nie używaj rand jeśli nie musisz: http://channel9.msdn.com/Events/GoingNative/2013/rand-Considered-Harmful

Masz <random> z std::uniform_int_distribution:

	mt19937 gen{random_device{}()};
	
	uniform_int_distribution<> dis(100,999);

	int val = dis(gen);

http://melpon.org/wandbox/permlink/OepqlTVVdduQdQOw

0

A jeszcze chciałem napisać taki program co losuje liczby od 100 do 999 włącznie i wypisze wszystkie 899 losowania bez powtórzeń, ale nie wiem czemu jak wypisze pierwszą liczbę to dalej nie wypisuje kod:

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

using namespace std;
bool Prawda(int liczba, int tab[], int ile);
int main()
{

	int tablica[999];
	srand(time(NULL));


	for(int i = 0; i < 999;)
	{
		int liczba = rand() % 900 + 100;
		if(Prawda(liczba,tablica,i) == false)
		{
			tablica[i] = liczba; 
			cout << liczba << endl;
			i++;
		}
	}

	system("pause");


}
bool Prawda(int liczba, int tab[], int ile)
{
	for(int i = 0; i < ile; i++)
	{
		tab[i] == liczba;
		return true;
	}
	return false;
} 
2

A jeszcze chciałem napisać taki program co losuje liczby od 100 do 999 włącznie i wypisze wszystkie 899 losowania bez powtórzeń,

Wrzuć 900 liczb kolejno do kontenera, np std::vector, potem std::shuffle i gotowe.

2

Po pierwszym przepiegu pętli w funkcji Prawda (ciekawa nazwa swoją drogą) wychodzisz (zwracasz true)

2
bool Prawda(int liczba, int tab[], int ile)
{
    for(int i = 0; i < ile; i++)
    {
        tab[i] == liczba;
        return true;
    }
    return false;
} 

Nie sprawdzasz warunku, tylko wykonujesz porównanie, po czym po prostu zwracasz true. Poprawione:

bool Wystepuje(int liczba, int tab[], int ile)
{
    for(int i = 0; i < ile; i++)
    {
        if(tab[i] == liczba)
            return true;
    }
    return false;
} 

Ale można to skrócić do: (pisane z pamięci, ale powinno być ok)

bool Wystepuje(int liczba, int tab[], int ile)
{
    return any_of(tab, tab+ile, [=](int val) { return val == liczba; });
} 

ewentualnie:

bool Wystepuje(int liczba, int tab[], int ile)
{
    return any_of(tab, tab+ile, bind(equal_to<int>, liczba, placeholders::_1));
} 
0

ok dzięki, a czy istnieje taka możliwość aby wylosowane liczby z tablicy wyświetlać od najmniejszej do największej ?

0

Sortuj i wypisz.

1
nowicjusz35 napisał(a):

ok dzięki, a czy istnieje taka możliwość aby wylosowane liczby z tablicy wyświetlać od najmniejszej do największej ?

Tak:

for(int i = 100; i < 1000; ++i){
    cout << i << ", ";
}
cout << endl;
0

Najpierw wytłumacz o co chodzi bo nie rozumiem...

"program co losuje liczby od 100 do 999 włącznie i wypisze wszystkie 899 losowania bez powtórzeń".

0

Już mam program, który losuje liczby od 100 do 999 do tablicy bez powtórzeń za pomocą funkcji rand.
Tera chciałbym te wylosowane liczby z tej tablicy wyświetlić od najmniejszej do największej jak się da.

0

Ile masz tych liczb? Mówisz, że losujesz wszystkie, czyli masz 899 liczb? To wyświetl liczby od 100 do 999 - to są wszystkie liczby które masz

1

losuję 900 liczb równo

W takim razie postaraj się chwilkę logicznie pomyśleć. Masz 900 liczb, żadna się nie powtarza. Zakres ich wartości to [100,999], czyli jest ich 900. Inaczej mówiąc, masz gwarancję, że każda liczba z tego zakresu występuje dokładnie jeden raz. Wobec tego nie potrzebujesz przeprowadzać operacji na wylosowanej tablicy, po prostu wyświetl wartości pomiędzy 100 a 999, czyli:

for(int i = 100; i < 1000; ++i){
    cout << i << ", ";
}
cout << endl;
0

coś nie chcę wypisać, robi się nieskończona pętla:

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

using namespace std;
bool Wystepuje(int liczba, int tab[], int ile);
int main()
{

	int tablica[999];
	srand(time(NULL));


	for(int i = 0; i < 999;)
	{
		int liczba = rand() % 900 + 100;
		if(Wystepuje(liczba,tablica,i) == false)
		{
			tablica[i] = liczba; 
				for(int i = 100; i < 1000; ++i){
    cout << i << ", ";
			i++;
		}
			
	}
		for(int i = 100; i < 1000; ++i){
		cout << i << ", ";
}
cout << endl;

}
	
system("pause");


}
bool Wystepuje(int liczba, int tab[], int ile)
{
	for(int i = 0; i < ile; i++)
	{
		if(tab[i] == liczba)
		return true;
	}
	return false;
}
  
1
/*
Tu sobie sortujesz to co masz
*/

// Tu wypisujesz liczby rosnąco od 100 do 999
for(int i = 100; i < 1000; ++i){
    cout << i << ", ";
}
cout << endl;

W wyniku masz:
100, 101, 102, 103, 104, **... **997, 998, 999,

2

Losujesz dopóki nie wylosujesz 999 różnych liczb z zakresu 900 liczb. Nic dziwnego, że pętla nigdy się nie kończy.

#include <iostream>
#include <cstdlib>
#include <ctime>
 
using namespace std;
bool Wystepuje(int liczba, int tab[], int ile);
int main()
{
	
	int tablica[900];
	srand(time(nullptr));
	
	// jest 900, nie 999, stad petla nieskonczona
	// do tego w petli tylko losujesz, wyswietl po wylosowaniu
	for(int i = 0; i < 900;)
	{
		int liczba = rand() % 900 + 100;
		if(Wystepuje(liczba,tablica,i) == false)
		{
			tablica[i] = liczba;
		}
		
	}
	
	// wylosowales, wyswietl wyniki:
	for(int i = 100; i < 1000; ++i){
		cout << i << ", ";
	}
	cout << endl;
	
	// ugh
	system("pause");
}
bool Wystepuje(int liczba, int tab[], int ile)
{
	for(int i = 0; i < ile; i++)
	{
		if(tab[i] == liczba)
			return true;
	}
	return false;
}

PS: indentacja. Wcześniej miałeś dobrą, a teraz "na odwal się"

0

faktycznie ten mój kod coś się pogorszył. Już ustawiłem wszystko tak jak powinno być:

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

using namespace std;
bool Wystepuje(int liczba, int tab[], int ile);
int main()
{

	int tablica[999];
	srand(time(NULL));


	for(int i = 0; i < 999;)
	{
		int liczba = rand() % 900 + 100;
		if(Wystepuje(liczba,tablica,i) == false)
		{
			tablica[i] = liczba; 
			i++;
		}
		for(int i = 100; i < 1000; ++i)
		{
        cout << i << ", ";
		}

	system("pause");

	}
}
bool Wystepuje(int liczba, int tab[], int ile)
{
	for(int i = 0; i < ile; i++)
	{
		if(tab[i] == liczba)
		return true;
	}
	return false;
}
 
0

ale po co, jak wiadomo, że w tablicy są właśnie takie liczby

2

Wciąż masz pętlę nieskończoną:

// i nigdy nie przekroczy wartości 900
for(int i = 0; i < 999;)

Znów wyświetlasz w złym miejscu (t.j. w pętli nieskończonej):

    for(int i = 0; i < 999;)
    {
        int liczba = rand() % 900 + 100;
        if(Wystepuje(liczba,tablica,i) == false)
        {
            tablica[i] = liczba; 
            i++;
        }
        for(int i = 100; i < 1000; ++i)
        {
        cout << i << ", ";
        }
 
    system("pause");
 
    }

Z sortowaniem i wyświetlaniem zawartości tablicy (co nie ma sensu w tym przypadku):

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

using namespace std;
bool Wystepuje(int liczba, int tab[], int ile);
int main()
{
	
	int tablica[900];
	srand(time(NULL));
	
	
	for(int i = 0; i < 900;)
	{
		int liczba = rand() % 900 + 100;
		if(Wystepuje(liczba,tablica,i) == false)
		{
			tablica[i] = liczba; 
			i++;
			
		}
	}
	
	// sortujesz zawartość tablicy
	sort(begin(tablica), end(tablica));
	// jak jesteś fanem średniowiecza i używasz kompilatora z tego okresu:
	// sort(tablica, tablica+900);
	
	// wyświetlasz zawartość tablicy
	for(int i = 0; i < 900; ++i){
		cout << tablica[i] << ", ";
	}
	cout << endl;
	
	system("pause");
}
bool Wystepuje(int liczba, int tab[], int ile)
{
	for(int i = 0; i < ile; i++)
	{
		if(tab[i] == liczba)
			return true;
	}
	return false;
}
2

Przy okazji, zamiast wymyślać koło na nowo, możesz też użyć algorytmów z biblioteki standardowej oraz pomyślunku. Cały Twój kod można uprościć do:

	vector<int> data(900);

	iota(begin(data), end(data), 100);
	// zawartość data to teraz [100, 101, 102... 997, 998, 999]

	shuffle(begin(data), end(data), mt19937{random_device{}()});
	// zawartość data to teraz liczby z zakresu <100, 999> bez powtórzeń, w
	// kolejności losowej

	sort(begin(data), end(data));
	// zawartość data to znów [100, 101, 102... 997, 998, 999]

http://melpon.org/wandbox/permlink/bjBLIeJ42gvk9y6l

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