Hola,
Quieres que el valor del array en cada indice sea el peso sobre la ponderacion de la pseudo-aleatoriedad, no?
Por ejemplo, si tienes la suerte que todos los valores del array valgan 100 y array[0] = 5, tu algoritmo devuelva un 0 el 5% de las veces. Es esto correcto?
Si no te preocupa la memoria puedes hacerlo de una manera muy rapida. Puedes utilizar otra estructura en vez de tu array plano. Si tienes un array asi:
a[0] = 2; a[1] = 1; a[2] = 3
Tendrias un array como el siguiente:
otherA[0] = 0; otherA[1] = 0 ;otherA[2] = 1; otherA[3] = 2; otherA[4] = 2; otherA[5] = 2;
En vez de indexar el valor siempre puedes anhadir el numero de veces el nuevo indice que quieres incluir y tu funcion random iria de 0 al tamanho de otherA. Esto significa que tendras siempre un array/lista en memoria cuya longitud es el numero total de apariciones. Es mucho gasto de memoria, pero es rapido. Y a la hora de incluir o borrar hay que hacer algo de magia.
Si estas forzado a mantener el array original puedes hacer un alrgoritmo que haga lo siguiente:
- calcula el valor del agregador total de valores, llamemoslo n. (Siempre puedes guardarlo en alguna variable y mantenerlo)
- randomIndex = rand() % n;
- int currentIndex = 0; int realIndex = 0;
- while (currentIndex < randomIndex) {
if (realIndex == array.length - 1) {
break;
}
if (randomIndex >= currentIndex + array[realIndex + 1]) {
currentIndex += array[realIndex++];
} else {
break;
}
}
- realIndex es el valor del indice que quieres obtener
Esta solucion no tiene mala pinta. Habria que verificar casos limite pero en general este esquema puede funcionar.
Te va bien?
Un saludo!
PS Perdona por las tides y derivados. Juro que el teclado extranjero tiene la culpa!