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;
Ty tak poważnie? Losujesz coś i dodajesz do tego 900. Jak chcesz uzyskać coś mniejszego od 900?
Shalom napisał(a):
Ty tak poważnie? Losujesz coś i dodajesz do tego 900. Jak chcesz uzyskać coś mniejszego od 900?
liczby ujemne?
Poprawiam:
int liczba = rand() % 900 + 100
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);
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;
}
for(int i = 0; i < 999;)
chcesz wylosować 999 liczb z przedziału 900 liczb? ;)
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.
srand
i rand
. Po trzecie nazywasz funkcje w kompletnie nieczytelny sposób (co zwraca Prawda(x,y,z)
?). Po czwarte wymyślasz koło na nowo zamiast użyć gotowych algorytmów (polecam obejrzenie http://channel9.msdn.com/Events/GoingNative/2013/Cpp-Seasoning ). Po piąte: używasz NULL
zamiast nullptr
oraz system("pause")
do zatrzymania konsoli. No ok, może ciut się czepiam, ale współpracownika bym... zrugał za taki kod.
std::random_shuffle
a std::shuffle
.
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));
}
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;
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.
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;
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;
}
/*
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,
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ę"
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;
}
ale po co, jak wiadomo, że w tablicy są właśnie takie liczby
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;
}
i++
jest wykonywane wyłącznie jeśli dodasz nowy element do tablicy. A dodać nowego elementu nie możesz ponad 900, ponieważ po dodaniu 900 elementów masz 100% szans na powtórzenie się liczby.
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]
Shalom