Archief - C++: Unieke getallen genereren binnen range

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

Kennaah

Legacy Member
Ik moet voor een cursus een soort lottoprogramma maken, waarbij het programma random getallen genereert tussen 1-42. Hierbij mogen echter geen dubbele getallen bijzitten.

Na wat proberen zou ik echt niet weten hoe ik hier voor zou moeten controleren.
Code:
for (int i=0; i<TREKKING; i++) 
	{
			int random=(rand() %(BOVENGRENS-ONDERGRENS)+ONDERGRENS); 
			trek[i] = random;
			cout << trek[i] << " ";	
			cout << endl;
	}

Dit is de for lus die ik gemaakt heb om 6 random getallen te generen en ze vervolgens in een array te steken.
BOVENGRENS=42
ONDERGRENS=1
TREKKING=6

Kan iemand mij verder helpen?

Tyfius

Legacy Member
In je loop sla je die getallen op in een lijst. Voor je er een aan toevoegt controleer je de lijst of het nieuwe getal er al in zit.

Gebruik in plaats van een if een do-while. Hou daarin een teller bij en vergelijk die met TREKKING en blijf loopen tot je alle getallen hebt. Verhoog die teller ook maar als je effectief een getal toevoegt.

Ik typ dit van op men GSM en het is nogal moeilijk hier een code voorbeeld te typen. Mocht het niet duidelijk zijn kan ik dat wel eens proberen als ik terug thuis ben.

Kennaah

Legacy Member
Code:
	do 
	{
		int random=(rand() %(BOVENGRENS-ONDERGRENS)+ONDERGRENS); 
			trek[teller] = random;
			cout << trek[teller] << " ";	
			cout << endl;
			teller++;
	}
	while (trek[teller] != trek[teller-1] && teller<TREKKING);

Zo'n do while lus dan ongeveer?
(teller declareren bovenaan)

ForzaMantis

Legacy Member
Ik zou het in een aparte functie zetten en een static array van lengte 42 aanmaken van't type bool. Iedere cel initialiseren op true, en als het gekozen wordt, op false zetten. Als je een getal moet kiezen, kun je controleren met een while loop.

Tyfius

Legacy Member
saito zei:
Ik zou het in een aparte functie zetten en een static array van lengte 42 aanmaken van't type bool. Iedere cel initialiseren op true, en als het gekozen wordt, op false zetten. Als je een getal moet kiezen, kun je controleren met een while loop.
Een lijst van booleans zou ik nu niet meteen doen. Maar het bracht mij wel op het idee om dit met een Fisher&#8211;Yates shuffle op te lossen.

Code:
void shuffle(int *list, int size) {
	srand(static_cast<unsigned int>(time(0)));

	for (int i = size - 1; i > -1; --i) {
		int j = rand() % (i + 1);
		if (i != j) {
			int t = list[i];
			list[i] = list[j];
			list[j] = t;
		}
	}
}
Wat je doet is een lijst samenstellen van 1 tot en met 42, die shuffelen en dan het gewenst aantal items eruit halen.
Code:
int main() {
	int list[42];
	for (int i = 1; i <= 42; i++) {
		list[i - 1] = i;
	}

	shuffle(list, 42);

	for (int i = 0; i < 6; i++) {
		std::cout << list[i] << std::endl;
	}
}
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan