• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

generowanie nowej liczby pseudolosowej z użyciem poprzedniej

VPS Starter Arubacloud
0 głosów
373 wizyt
pytanie zadane 28 października 2015 w C i C++ przez kruker Nowicjusz (120 p.)
Witam

Jestem bardzo początkującym uczniem C++. Natrafiłem na taki problem i nie znalazłem nigdzie odpowiedzi (może źle szukam). Program, który odgaduje liczbę, o której ja pomyślałem - wylosowałem liczbę za pomocą komendy "int liczba = rand() % 100+1;" Teraz zależy mi na wygenerowaniu przez program nowej liczby pseudolosowej ze zbioru tych, które "nie padły" za pierwszym razem. Tzn. jeśli program wylosował np. liczbę 70, to chcę ( w zależności od wyboru komendy w programie)żeby kolejna liczba była ze zbioru (71,100) lub (1,69). Jak to w takim razie zapisać?

Próbowałem czegoś takiego na liczbę większą niż pierwsza wylosowana, ale nie działa tak jakbym chciał (oczywiście wszystko jest w pętli):

int y=liczba;

liczba = rand() % (100-y)+1;    

Z góry dziękuję za pomoc.

5 odpowiedzi

0 głosów
odpowiedź 28 października 2015 przez radek024 Szeryf (77,180 p.)
Czyli po prostu chcesz, aby liczba która już wystąpiła, nie pojawiła się kolejny raz? Można to zrobić, chociaż to będzie żmudna praca - wymaga poznania tablic oraz pętl - ale te rozwiązanie może Ci się nie spodobać ;)
komentarz 28 października 2015 przez kruker Nowicjusz (120 p.)
Do tablic jeszcze nie doszedłem, pętle znam (tzn. jestem zaznajomiony :)). Czyli nie da się tego rozwiązać bez znajomości tablic? I nie chodzi tylko o to, żeby wylosowana liczba się już nie powtórzyła, ale też o to, że sygnalizuję programowi, że liczba o której myślę jest np. większa niż wylosowana czyli w przypadku np. 70, kolejny raz będzie losował już tylko ze zbioru (71,100).
komentarz 28 października 2015 przez radek024 Szeryf (77,180 p.)
Niestety, ale się nie da - do każdej kolejnej komóki tablicy przypisywałbyś liczbę, pętla natomiast sprawdzałaby, czy nowo wylosowana liczba już jest w tablicy - jeżeli nie, zajmowałą by kolejne miejsce.
0 głosów
odpowiedź 28 października 2015 przez Radfler VIP (101,030 p.)
Przecież tu chodzi o losowanie bez powtórzeń! Wpisz w wyszukiwarkę na tym forum "losowanie bez powtórzeń". Temat pojawiał się mnóstwo razy ;)
0 głosów
odpowiedź 28 października 2015 przez emSon Stary wyjadacz (10,480 p.)
int randomNumber = rand()%100+1; // losowanie pierwszej liczby

...

int secondRandomNumber; // deklaracja drugiej liczby

if(userCommand == 1) secondRandomNumber = rand()%(randomNumber+1)-1; 
else if(userCommand == 2) secondRandomNumber = rand()%100+randomNumber+1;

//userCommand to komenda użytkownika

Myślę, że o takie coś ci chodziło. Narazie odpuść sobie losowanie bez powtórzeń. Gdy poznasz tablicę wrócisz do kodu i go ulepszysz ;)

komentarz 28 października 2015 przez radek024 Szeryf (77,180 p.)
To działa tylko dla dwóch zmiennych, a jeżeli potrzeba więcej? Jeżeli użytkownik będzie sam chciał ustalić ilość losowanych liczb? Zadziała, ale bardzo sztywno i lepiej nauczyć się nieco o tablicach oraz pętlach anieżeli używać takiego czegoś ;)
komentarz 28 października 2015 przez emSon Stary wyjadacz (10,480 p.)
Masz rację. Jeśli kruker się wstrzyma i pozna tablicę to wtedy program będzie dużo lepszy, ale jeśli chce go robić teraz to musi się liczyć z tym, że nie będzie do końca działał tak jak on chce.
komentarz 28 października 2015 przez kruker Nowicjusz (120 p.)
Dziękuję, właśnie o coś takiego mi chodziło :)
0 głosów
odpowiedź 28 października 2015 przez Newtonik Gaduła (3,660 p.)

O ile dobrze pamiętam linijka na początku programu  srand (time (NULL) );  powoduje że liczba się nie powtórzy przy następnym losowaniu.

 

0 głosów
odpowiedź 28 października 2015 przez Sinnley Stary wyjadacz (12,810 p.)

Heh, sam mierzyłem się z tym problemem (dosłownie!) 5 minut temu.

Kod, który napisałem:

#include <iostream>
#include <time.h>
#include <cstdlib>
using namespace std;



int main()
{
	srand(time(NULL));
	
	bool zakres[101];
	int wylosowane[11];
	int liczba;
	int wylosowanych = 0;

	for (int i = 0; i <= 100;i++) zakres[i] = false;
	
	
	
	do
	{
		liczba = rand() % 100 + 1;
		
		if (zakres[liczba] = false)
		{
			
			wylosowane[wylosowanych] = liczba;
			wylosowanych++;
			zakres[liczba] = true;

		}

		

	} while (wylosowanych != 10);

		for (int i = 0; i < 10; i++)
	{
		cout << wylosowane[i];
		
		}
	
	
	return 0;
}

 

Podobne pytania

0 głosów
2 odpowiedzi 235 wizyt
pytanie zadane 8 lutego 2016 w C i C++ przez Noak Mądrala (5,900 p.)
0 głosów
4 odpowiedzi 447 wizyt
pytanie zadane 17 listopada 2015 w C i C++ przez subterras Użytkownik (680 p.)
0 głosów
1 odpowiedź 203 wizyt
pytanie zadane 20 października 2015 w Inne języki przez Krzysztof Rampa Nowicjusz (190 p.)

92,454 zapytań

141,263 odpowiedzi

319,099 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...