El algoritmo Alias que mencionas en tu comentario es un enfoque inteligente, pero a menos que necesites una eficiencia extrema, vale más la pena. No me gusta por varias razones, pero es inteligente. Método de alias: Wikipedia tiene instrucciones simples paso a paso sobre cómo generar las tablas.
Si desea ver cómo funciona una vez que se generan las tablas, mire la tabla a continuación.
- Si estudié modelado matemático financiero avanzado en la universidad con un coeficiente intelectual de 145, ¿con qué probabilidad podría construir un algoritmo HFT rentable?
- ¿La matriz de Java de primitivas se almacena en la pila o el montón?
- ¿Cómo "mira hacia adelante" un algoritmo de aprendizaje por refuerzo para saber qué acción tomar en este momento?
- ¿Hay algún tutorial de algoritmos y estructuras de datos donde aprendas a través de los juegos?
- ¿Qué tan difícil fue crear e implementar el algoritmo de clasificación de página inicial de los primeros Google?
Multiplica una variable aleatoria U (0,1) por 16. La parte entera selecciona la columna de 0 a 15. Si la parte fraccionaria es mayor que el número en la fila P, devuelve el valor en la fila Y debajo de ella. Si la parte de la fracción es menor que el número en la fila P, simplemente devuelve la parte entera.
Entonces, si 16 veces su número aleatorio es 0.5, va a la columna 0 (la parte entera) y dado que la parte fraccionaria (0.5) es mayor que el número en la fila P (0), devuelve el número en la fila Y ( 5) Para cada parte entera, la tabla muestra qué números se devuelven con qué probabilidad. La suma de cada columna es 1, por supuesto. la suma de cada fila es 16 veces la probabilidad de que se devuelva cada número del 2 al 12, y como puede ver, corresponden a las probabilidades de dados correctas.
En la mayoría de las aplicaciones, puede aprovechar mejor la estructura de sus datos. Por ejemplo, la suma de dos dados se simula fácilmente como [int (6 * r1)] + [int (6 * r2)] + 2. Si generar dos números aleatorios es demasiado costoso, puede usar el mismo truco de multiplicar un número aleatorio por 6, tomar la parte entera, luego multiplicar la parte fraccional por 6 y tomar la parte entera de eso.