Losowanie liczb z zakresu 100-999

Losowanie liczb z zakresu 100-999
N3
  • Rejestracja:ponad 10 lat
  • Ostatnio:ponad 9 lat
  • Postów:420
0

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

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

teraz masz od 900 do 999

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

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


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
0
Shalom napisał(a):

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

liczby ujemne?

Shalom
Losuje liczby tylko dodatnie...
N3
  • Rejestracja:ponad 10 lat
  • Ostatnio:ponad 9 lat
  • Postów:420
0

Poprawiam:

Kopiuj
 int liczba = rand() % 900 + 100
kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 22 godziny
  • Lokalizacja:Szczecin
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:

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

	int val = dis(gen);

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


edytowany 1x, ostatnio: kq
N3
  • Rejestracja:ponad 10 lat
  • Ostatnio:ponad 9 lat
  • Postów:420
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:

Kopiuj
#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;
} 
kq
for(int i = 0; i &lt; 999;) chcesz wylosować 999 liczb z przedziału 900 liczb? ;)
kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 22 godziny
  • Lokalizacja:Szczecin
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.


edytowany 2x, ostatnio: kq
Zobacz pozostały 1 komentarz
kq
Po pierwsze, sam napisałeś, że nie działa zgodnie z Twoimi założeniami. Po drugie używasz 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(&quot;pause&quot;) do zatrzymania konsoli. No ok, może ciut się czepiam, ale współpracownika bym... zrugał za taki kod.
N3
nie znam na tyle jęz angielskiego aby oglądać filmy po angielsku. Prawda(x,y,z) zwraca wartość true albo false zależy czy liczba się powtarza czy nie. Jeśli się nie powtarza to powinna wyświetlić się następna liczba wylosowana.
kq
No to należy popracować nad angielskim, w tym fachu to podstawa :) . Zauważyłeś już kompletny brak związku między nazwą funkcji a jej działaniem?
hauleth
Nie std::random_shuffle a std::shuffle.
kq
Fakt, dzięki, poprawione.
2

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

kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 22 godziny
  • Lokalizacja:Szczecin
2
Kopiuj
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:

Kopiuj
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)

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

ewentualnie:

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

N3
  • Rejestracja:ponad 10 lat
  • Ostatnio:ponad 9 lat
  • Postów:420
0

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

xfin
Posortować do tablicy tmp może? Chyba, że nie chcesz osobnej tablicy.
twonek
  • Rejestracja:ponad 10 lat
  • Ostatnio:prawie 2 lata
  • Postów:2500
0

Sortuj i wypisz.

kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 22 godziny
  • Lokalizacja:Szczecin
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:

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

edytowany 1x, ostatnio: kq
Zobacz pozostałe 7 komentarzy
kq
@nowicjusz35 W przypadku gdy wylosowałeś wszystkie liczby z zakresu - po prostu wyświetl ich wartości w kolejności, tak jak pokazałem w poście (nie potrzebujesz sortować tablicy zawierającej liczby z zakresu 100-999, jeśli wiesz, że wszystkie występują). Jeśli nie - posortuj i wyświetl posortowany kontener.
N3
ale oni wtedy wyświetlą się od najmniejszej do największej ? bo chyba będą pomieszane
kq
Zauważ, że nie wyświetlasz zawartości tablicy, tylko liczby!
xfin
@kq - zwracam honor. Dopiero jak spojrzałem na kod to zobaczyłem o co chodzi. Gdy nowicjusz pisał co chce zrobić, myślałem, że chodzi tylko o wypisanie wyników bez powtórzeń. Ale dalej nie rozumiem, po co losować 899 liczb bez powtórzeń, tylko po to, żeby je wypisać w kolejności rosnącej, skoro moża to załatwic tą pętlą.
kq
Myślę, że należy tutaj wziąć pod uwagę jego nick ;)
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ń".

N3
  • Rejestracja:ponad 10 lat
  • Ostatnio:ponad 9 lat
  • Postów:420
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.

kq
Losujesz 900 liczb czy mniej?
N3
po prostu chcę zobaczyć czy takie coś jest możliwe, nigdy jeszcze takiego czegoś nie robiłem.
N3
losuję 900 liczb równo
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

kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 22 godziny
  • Lokalizacja:Szczecin
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:

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

N3
coś za bardzo nie działa, po pętli for to wstawić ?
kq
Tam, gdzie chcesz wypisać wszystkie wylosowane liczby.
N3
  • Rejestracja:ponad 10 lat
  • Ostatnio:ponad 9 lat
  • Postów:420
0

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

Kopiuj
#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;
}
  
H4
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 4 lata
  • Postów:107
1
Kopiuj
/*
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,

edytowany 1x, ostatnio: Hell4Ge
kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 22 godziny
  • Lokalizacja:Szczecin
2

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

Kopiuj
#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ę"


edytowany 2x, ostatnio: kq
N3
co masz na myśli mówiąc o indentacji ?
kq
wyrównanie kodu. http://i.imgur.com/QkQb7KA.png nowy fragment wygląda tragicznie. (pomijając, że w złym miejscu wkleiłeś)
N3
  • Rejestracja:ponad 10 lat
  • Ostatnio:ponad 9 lat
  • Postów:420
0

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

Kopiuj
 #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;
}
 
N3
tylko, że ta pętla co podałeś wyświetla po prosty liczby od 100 do 999, a chciałbym żeby to z tablicy w takiej kolejności wyświetlało
0

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

N3
tak po prostu chciałbym zobaczyć jak taki program się piszę bo nigdy nie tego nie robiłem.
kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 22 godziny
  • Lokalizacja:Szczecin
2

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

Kopiuj
// 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):

Kopiuj
    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):

Kopiuj
#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;
}

edytowany 2x, ostatnio: kq
N3
ale mam przecież i++; a potem i < 999 to czemu jest nie skończona ?
kq
bo 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.
kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 22 godziny
  • Lokalizacja:Szczecin
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:

Kopiuj
	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


Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)