In meinem Algorithmus habe ich zwei Werte, die ich zufällig auswählen muss, aber jede muss eine bestimmte Anzahl von Malen gewählt werden.Zufällige Auswahl von zwei Werten
Bis jetzt ist meine Lösung, die Wahlen in einen Vektor die korrekte Anzahl von Zeiten zu setzen und dann es zu mischen. In C++:
// Example choices (can be any positive int)
int choice1 = 3;
int choice2 = 4;
int number_of_choice1s = 5;
int number_of_choice2s = 1;
std::vector<int> choices;
for(int i = 0; i < number_of_choice1s; ++i) choices.push_back(choice1);
for(int i = 0; i < number_of_choice2s; ++i) choices.push_back(choice2);
std::random_shuffle(choices.begin(), choices.end());
Dann halte ich einen Iterator auf choices
und wann immer ich einen neuen brauchen erhöhe ich den Iterator und diesen Wert greifen.
Das funktioniert, aber es scheint, als könnte es einen effizienteren Weg geben. Da ich immer weiß, wie viele von jedem Wert ich verwenden werde, frage ich mich, ob es einen algorithmischeren Weg gibt, dies zu tun, anstatt nur die Werte zu speichern.
Ich würde mit der Arbeitslösung bleiben, es sei denn, es gibt einen guten Grund, warum nicht. Wird es als Engpass oder ähnliches profiliert? – amit
Es gibt einen Weg, aber es wäre weniger klar und prägnant. Ich würde bei dieser Technik bleiben. –
Ich mag diese Lösung wirklich so, wie sie ist. Alle anderen Lösungen, die Ihnen in den Sinn kommen (nachdem Sie etwa 5 Sekunden lang darüber nachgedacht haben), betreffen Zufallszahlengeneratoren. Aber da Sie eine vorbestimmte Anzahl von jeder Wahl haben, wären diese Lösungen ineffektiv, da sie letztendlich Werte ignorieren müssten, nachdem ihre Wahl bereits die maximale Anzahl von Malen aufgetreten ist. (zugegebenermaßen ist die Shuffle-Methode möglicherweise ein CPU-Drain, aber Sie können es zumindest zu einer vorhersagbaren Laufzeit machen, was Sie mit den oben erwähnten Lösungen nicht tun können) – gnomed