Archief - C: Randomize + unieke getallen

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.

Noizz.be

Legacy Member
Hoi

met onderstaande code wil ik hetvolgende bereiken.
Gebruiker voegt een getal in (aantal vragen dat deze wilt oplossen)

dan wordt en tabel gemaakt met een uniek nummer en dan de nummer van een vraag.
bvb:
Code:
1  3
2  2
3  7
4  8
5  1

Probleem is, dat met mijn code soms meerdere malen hetzelfde getal wordt ingevuld.
bvb:
Code:
1  2
2  3
3  2
4  2
5  8

Hoe kan ik ervoor zorgen dat ik enkel unieke getallen heb?

mijn code:

Code:
	randomize();
	for(i=0;i<aantal_optelossen;i++)
	{
		rand_tab[i][0] = i;
		rand_tab[i][1] = rand() % aantal_vragen;
	}

Alvast bedankt!
Noizz

GrAmLin

Legacy Member
zet eens randomize(); in je for lust.

Nu staat hij er buiten. Als je em er in zet moet het normaalgaan.

Groeten

QplQyer

Legacy Member
Je initialiseert eerst alle waarden in je tabel met dezelfde waarde als de index in je tabel.
Vervolgens overloop je je tabel, je genereert telkens je je i verhoogt een random getal en gebruikt dat random getal als index in je tabel, zo heb je twee waarden uit je tabel, de waarde die je hebt door tabel te gebruiken en de waarde door tabel[randomwaarde], verwissel die twee en ga verder naar het volgende getal.
Zo smijt je snel je hele tabel door elkaar.

Het kan beter allicht, maar het is een oplossing.

Hale

Legacy Member
idd, zoals QplQyer zei :
permutatie maken van de indexen van je array.

Krueger

Legacy Member
QplQyer zei:
Je initialiseert eerst alle waarden in je tabel met dezelfde waarde als de index in je tabel.
Vervolgens overloop je je tabel, je genereert telkens je je i verhoogt een random getal en gebruikt dat random getal als index in je tabel, zo heb je twee waarden uit je tabel, de waarde die je hebt door tabel te gebruiken en de waarde door tabel[randomwaarde], verwissel die twee en ga verder naar het volgende getal.
Zo smijt je snel je hele tabel door elkaar.

Het kan beter allicht, maar het is een oplossing.

Is het zo zeker dat je enkel unieke waarden gaat genereren?
Een andere mogelijkheid is (misschien niet zo efficiënt, maar met kleine tabellen zal je er niets van merken)

Code:
randomize();
	for(i=0;i<aantal_optelossen;i++)
	{
		rand_tab[i][0] = i;
                randomGetal=rand() % aantal_vragen;
		rand_tab[i][1] =randomGetal;
                for(int j=0;j<i;j++) if(rand_tabel[j][1]==randomGetal) i--;
	}

QplQyer

Legacy Member
Krueger zei:
Is het zo zeker dat je enkel unieke waarden gaat genereren?
Een andere mogelijkheid is (misschien niet zo efficiënt, maar met kleine tabellen zal je er niets van merken)

Code:
randomize();
	for(i=0;i<aantal_optelossen;i++)
	{
		rand_tab[i][0] = i;
                randomGetal=rand() % aantal_vragen;
		rand_tab[i][1] =randomGetal;
                for(int j=0;j<i;j++) if(rand_tabel[j][1]==randomGetal) i--;
	}
Wel, aangezien je enkel maar de waarden in je array verwisselt (dus permuteert inderdaad) en je die array hebt geïnitialiseerd met unieke waarden is er geen kans op dubbels. Je gebruikt de random waarde namelijk niet als een nieuwe waarde, maar wel als een index in je array, je kan dus nooit dubbels krijgen doordat je geen nieuwe waarden maakt en geen oude waarden laat staan bij 't verwisselen.

Jouw mogelijkheid is inderdaad wel enorm inefficiënt vergeleken met een permutatie die O(n) tijd neemt, de jouwe neemt minstens O(n²) en door dat backtracken nog een pak meer allicht, je merkt het niet bij kleine lijsten, maar hoe sneller hoe beter hé ;)

GrAmLin

Legacy Member
ow, mijn oplossing was duidelijk mis. Ik had vraag niet goed gelezen, wist niet dat het unieke getallen moesten zijn. Ik zouw met array werken en die dan doorlopen.

Grayfox

Legacy Member
QplQyer zei:
Je initialiseert eerst alle waarden in je tabel met dezelfde waarde als de index in je tabel.
Vervolgens overloop je je tabel, je genereert telkens je je i verhoogt een random getal en gebruikt dat random getal als index in je tabel, zo heb je twee waarden uit je tabel, de waarde die je hebt door tabel te gebruiken en de waarde door tabel[randomwaarde], verwissel die twee en ga verder naar het volgende getal.
Zo smijt je snel je hele tabel door elkaar.

Het kan beter allicht, maar het is een oplossing.

ksnap je uitleg niet echt, maar wat jij beschrijft lijkt me eerder op schufflen, zoals hale zei, een permutatie van je indexen.. maar hoe zal je dan een gelijkaardige tabel bekomen die in de topic beschreven stond?
Code:
1  3
2  2
3  7
4  8
5  1
volgens jouw methode zullen de randomgetallen toch nooit waarden hebben verschillend van de indexen? dus jouw methode klopt niet, of is toch niet wat er gevraagd werd. Het kan zijn dat ik er naast zit, want ik snap je uitleg dus aan geen kanten >_<
als het wel zou kloppen leg het dan eens goed uit want lijkt me anders wel interessant :p

Ik denk dat er niets anders opzit dan gewoon bij het genereren van een random getal telkens de array te overlopen om te kijken als hij er al niet in zit.. zoja, een nieuwe genereren.. zo zal je een array bekomen van unieke random getallen met een willekeurige range
*edit* Zoals kreuger dus gedaan heeft

QplQyer

Legacy Member
Grayfox zei:
ksnap je uitleg niet echt, maar wat jij beschrijft lijkt me eerder op schufflen, zoals hale zei, een permutatie van je indexen.. maar hoe zal je dan een gelijkaardige tabel bekomen die in de topic beschreven stond?
Code:
1  3
2  2
3  7
4  8
5  1
volgens jouw methode zullen de randomgetallen toch nooit waarden hebben verschillend van de indexen? dus jouw methode klopt niet, of is toch niet wat er gevraagd werd. Het kan zijn dat ik er naast zit, want ik snap je uitleg dus aan geen kanten >_<
als het wel zou kloppen leg het dan eens goed uit want lijkt me anders wel interessant :p

Ik denk dat er niets anders opzit dan gewoon bij het genereren van een random getal telkens de array te overlopen om te kijken als hij er al niet in zit.. zoja, een nieuwe genereren.. zo zal je een array bekomen van unieke random getallen met een willekeurige range
*edit* Zoals kreuger dus gedaan heeft
Uh my bad, had erover gekeken dat de waarden in je array niet hetzelfde waren als je indexen dus je hebt gelijk ja.

Misschien de beste mogelijkheid is om in de plaats van een array een HashMap te gebruiken, dat zal zowat het snelste zijn om te checken of een bepaald getal er al dan niet inzit, gaat namelijk in constante tijd.
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