En mi algoritmo tengo dos valores que debo elegir al azar, pero cada uno debe elegirse un número predeterminado de veces.Elecciones aleatorias de dos valores
Hasta ahora mi solución es poner las opciones en un vector el número correcto de veces y luego mezclarlo. En 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());
Entonces guardo un iterador a choices
y cada vez que necesito uno nuevo aumento el iterador y agarrar ese valor.
Esto funciona, pero parece que podría haber una manera más eficiente. Como siempre sé cuántos de cada valor usaré, me pregunto si hay una forma más algorítmica de hacer esto, en lugar de simplemente almacenar los valores.
Me quedaría con la solución de trabajo a menos que haya una buena razón para no hacerlo. ¿Está perfilado como un cuello de botella o algo así? – amit
Hay un camino, pero sería menos claro y conciso. Me quedaría con esta técnica. –
Realmente me gusta esta solución como es. Todas las otras soluciones que vienen a la mente (después de pensar durante unos 5 segundos) involucran generadores de números aleatorios. Pero dado que tiene un número predeterminado de cada opción, estas soluciones serían ineficaces ya que, en última instancia, tendrían que empezar a ignorar los valores una vez que su elección ya se hubiera producido la cantidad máxima de veces. (Es cierto que el método aleatorio es potencialmente un drenaje de CPU, pero al menos puede hacer que sea un tiempo de ejecución predecible, que no se puede hacer con las soluciones en las que estaba pensando) – gnomed