array per zufall umsortieren
-
hallo zusammen,
ich stehe vor folgendem problem. ich habe ein array, in dem zahlen stehen z.b.
1 2 3 4 5 6 7 8 9 10 11 11 11 11 11 11 11 11wie man sieht kommt es vor, dass zahlen doppelt vorkommen,diese stehen dann auch immer hintereinander (das kommt daher, dass das array nach und nach gefüllt wird und dadruch stehen die gleichen zahlen dann immer hintereinander)
nun wüfele ich mir eine zufallszahl aus. die zufallszahl ist maximal so gruß, wie das array lang ist. durch die zufallszahl suche ich mir halt ein array element aus. wenn z.b per zufall 5 rauskommt nehme ich aus dem array den wert an der 5. stelle also in dem obigen beispiel den wert 6.
wenn zahlen mehrfach vorkommen wie die 11 oben soll das bewirken, dass die 11 auch mit einer höheren wahrscheinlichkeit kommt als andere elmente des array. nur leider funktioniert das irgendwie nicht. ich hatte mir nun gedacht, dass array durchzuschütteln und es per zufall umzusortieren, so dass da z.b. rauskommt:
1 11 4 11 6 11 9 8 11 3 usw.
und dann per zufall ein element auswählen. leider weiß ich nciht, wie man das aray per zufall umsortiren kann. wäre toll, wenn mir da jemand helfen könnte.
vielen dank gruß
tommmi
-
sollte aber doch funktionieren:
#include <stdio.h> #include <stdlib.h> int main(void) { int i; int results[12] = { 0 }; int numbers[18] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 11, 11, 11, 11, 11, 11, 11 }; for (i = 0; i < 1000; ++i) results[numbers[rand() % 18]]++; for (i = 0; i < 12; ++i) printf("%i %i\n", i, results[i]); return 0; }
-
tommmi schrieb:
hallo zusammen,
ich stehe vor folgendem problem. ich habe ein array, in dem zahlen stehen z.b.
1 2 3 4 5 6 7 8 9 10 11 11 11 11 11 11 11 11wie man sieht kommt es vor, dass zahlen doppelt vorkommen,diese stehen dann auch immer hintereinander (das kommt daher, dass das array nach und nach gefüllt wird und dadruch stehen die gleichen zahlen dann immer hintereinander)
nun wüfele ich mir eine zufallszahl aus. die zufallszahl ist maximal so gruß, wie das array lang ist. durch die zufallszahl suche ich mir halt ein array element aus. wenn z.b per zufall 5 rauskommt nehme ich aus dem array den wert an der 5. stelle also in dem obigen beispiel den wert 6.
wenn zahlen mehrfach vorkommen wie die 11 oben soll das bewirken, dass die 11 auch mit einer höheren wahrscheinlichkeit kommt als andere elmente des array. nur leider funktioniert das irgendwie nicht.
Poste doch mal den relevanten Code.
ich hatte mir nun gedacht, dass array durchzuschütteln und es per zufall umzusortieren, so dass da z.b. rauskommt:
1 11 4 11 6 11 9 8 11 3 usw.
und dann per zufall ein element auswählen. leider weiß ich nciht, wie man das aray per zufall umsortiren kann. wäre toll, wenn mir da jemand helfen könnte.
vielen dank gruß
tommmiDamit ist die Wahrscheinlichkeit, dass die 11 drankommt genausogroß. => Das ist unötig verbaruchte Rechenleistung.
Gruß Caipi
-
hier mal der codeschnipsel. zuerst wird das array gefüllt, dann wird per zufall eine zahl gewürfelt und der wert des entsprechenden elements wird dann ausgelesen.
das problem ist, wenn ich nun sagen wir mal hinten 15 mal die 20 habe anschleißend 15 mal die 21 und dann 50 mal die 22, dass, obwohl die 22 50 mal drin steht selbsst bei einigen versuchen die 22 kaum raus kommt, obwohl sie ja gegenüber anderen zahlen so oft in dem array drin stehen.
short *zufallarray = new short[zaehler]; zufallarray[0] = 0; // Hier werden die ID's für die Endteilnehmer eingetragen for (ii = 1; ii <= AnzEndteilnehmer; ii++) { zufallarray[ii] = ii; help = help + 1; } // Hier werden die ID's für die Verteiler eingetragen pointer_vert = anfang_vert; while (pointer_vert != NULL) { typ = pointer_vert->typ; ID = pointer_vert->Nummer; if (typ == 'A') // Kleiner Verteiler ID wird 15 mal in das Array eingetragen { for (ii = help + 1; ii <= help + 16; ii++) { zufallarray[ii] = ID; } help = help + 15; } else if (typ == 'B') // Großer Verteiler ID wird 50 mal in das Array eingetragen { for (ii = help + 1; ii <= help + 51; ii++) { zufallarray[ii] = ID; } help = help + 50; } pointer_vert = pointer_vert->next; } // while(pointer_vert != NULL) // Hier wird die Länge des Arrays "zufallarray" ermittelt RandomMax = help + 1; Zufall = rand() % RandomMax; // Hier wir nun die Entsprechende Zahl aus dem Array ausgelesen Zufall = zufallarray[Zufall];
Edit by c.rackwitz: cpp-Tags und kleine Reformatierung