Jak wykluczyć możliwość wylosowania poprzednio wylosowanego elementu?

0

Cześć,
jak w tytule napisałem, zastanawiam się jak zaimplementować taki ficzer:
losujemy nazwisko z tablicy i jeśli kończy się ono na znak x, a wylosowany przyrostek zaczyna się na znak y, który nie pasuje i spełnia się warunek, to losujemy od nowa, ALE bez możliwości wylosowania poprzedniego przyrostka. O to kod:

void NGen::pickName() {
	if (sex == MALE) {
		chosenName = _Bnames[randomNameNumber]; //wybranie imienia
		chosenSurname = surnames[randomSurnameNumber] + surname_suffixes[random_SurSuff_Number]; //wybranie nazwiska i dodanie przyrostka
		if (chosenSurname.find_last_of('m') && random_SurSuff_Number == 12 || random_SurSuff_Number == 16) { //jeżeli ostatni znak jest 'm' i przyrostek o indeksie 12 || 16
			random_SurSuff_Number = random<int>(0, surname_suffixes.size()); //losuj na nowo
			chosenSurname = surnames[randomSurnameNumber] + surname_suffixes[random_SurSuff_Number]; //twórz nowe nazwisko, ale cały czas z tej samej puli >:(
		}
		else if (chosenSurname.find_last_of('t') && random_SurSuff_Number == 9) { //w przypadku gdy inny znak itp...
			random_SurSuff_Number = random<int>(0, surname_suffixes.size());
			chosenSurname = surnames[randomSurnameNumber] + surname_suffixes[random_SurSuff_Number]; // to samo co wyżej
		}
	}
}

No i właśnie się zastanawiam jak to napisać, aby nie było przypadku, że wylosuje mi ten sam przyrostek.. help :D
porady odnośnie tego spaghetti mile widziane. Jestem świadom, że ten crap nadaje się tylko do refactoringu :P
pozdro

0

A to będzie działać? w warunku losuję na nowo jedną liczbę, w tej samej zmiennej, a przykład na stronie losuje pare liczb w jednym zbiorze/tablicy.
Załóżmy, że pierwszy los wyniesie 1, ale nie podoba się nam to, więc losujemy ponownie tę samą zmienną, a więc skąd kompilator będzie wiedział, że ta zmienna ma nie mieć tej samej liczby? Rozumiem, że w takim wypadku po spełnieniu warunku przed następnym losowaniem będę musiał wymieszać swój kontener? Nadal jest szansa, że weźmie tę samą liczbę.. chociaż pewnie to tak nie działa tylko jestem kretynem

0

Dobra po paru zmianach wygląda to tak:

void NGen::pickName() {
	if (sex == MALE) {
		chosenName = _Bnames[randomNameNumber];
		chosenSurname = surnames[randomSurnameNumber] + surname_suffixes[random_SurSuff_Number];
		if (surnames[randomSurnameNumber].back() == 'm' && random_SurSuff_Number == 12 || 
			surnames[randomSurnameNumber].back() == 'm' &&random_SurSuff_Number == 16) {
			shuffle(surname_suffixes.begin(), surname_suffixes.end(), gen);
			chosenSurname = surnames[randomSurnameNumber] + surname_suffixes[random_SurSuff_Number];
		}
		if (surnames[randomSurnameNumber].back() == 't' && random_SurSuff_Number == 9) {
			shuffle(surname_suffixes.begin(), surname_suffixes.end(), gen);
			chosenSurname = surnames[randomSurnameNumber] + surname_suffixes[random_SurSuff_Number];	
		}
		//to się ciągnie tak dalej tylko argumenty w instrukcjach się zmieniają.
	}
}

zrezygnowałem ze sprawdzania czy liczba się powtórzyła, bo nie wiem jak ugryźć temat więc po prostu poszedłem na łatwiznę i szansa trafienia na to samo jest bardzo mała. Da się może jakoś ograniczyć ilość kodu, bo brzydko to wygląda?

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