La falacia del jugador es un sesgo cognitivo en el que erróneamente esperamos que las cosas que ocurrieron a menudo tengan menos probabilidades de ocurrir en el futuro y que las cosas que no ocurrieron en un tiempo tengan más probabilidades de suceder pronto. Su tarea es implementar una versión específica de esto.
Explicación del desafío
Escriba una función que devuelva un entero aleatorio entre 1 y 6, inclusive. El problema: la primera vez que se ejecuta la función, el resultado debe ser uniforme (dentro del 1%), sin embargo, cada llamada posterior se sesgará a favor de los valores que se han lanzado menos veces anteriormente. Los detalles específicos son los siguientes:
- El dado recuerda los recuentos de números generados hasta ahora.
- Cada resultado se pondera con la siguiente fórmula:
- Por ejemplo, si el rollo cuenta hasta ahora es , los pesos serán , es decir que usted será 4 veces más probabilidades de sacar un que un .
- Tenga en cuenta que la fórmula significa que un resultado de la tirada de se pondera igual que
Reglas y suposiciones
- Se aplican las reglas estándar de E / S y las lagunas prohibidas
- Los dados no deben ser deterministas. (es decir, use un PRNG sembrado de una fuente volátil, ya que normalmente está disponible como un generador incorporado).
- Su fuente aleatoria debe tener un período de al menos 65535 o ser verdadera aleatoriedad.
- Las distribuciones deben estar dentro del 1% para pesos de hasta 255
- Los RNG de 16 bits son lo suficientemente buenos como para cumplir con los requisitos anteriores. La mayoría de los RNG incorporados son suficientes.
- Puede pasar la distribución actual siempre que esa distribución esté mutada por la llamada o la distribución posterior al lanzamiento se devuelva junto con la tirada del dado. Actualizar la distribución / conteos es parte de este desafío .
- Puede usar pesas en lugar de conteos. Al hacerlo, cada vez que un peso cae a 0, todos los pesos deberían aumentar en 1 para lograr el mismo efecto que el conteo de almacenamiento.
- Puede usar estos pesos como repeticiones de elementos en una matriz.
Buena suerte. Que los bytes estén siempre a tu favor.
Respuestas:
R , 59 bytes
Pruébalo en línea!
Mantiene los recuentos
T
, que luego se transforman para usarse comoweights
argumentosample
(lo que probablemente los normaliza para sumar1
).El
[<<-
operador se utiliza para asignar un valor aT
uno de los entornos principales (en este caso, el único entorno principal es.GlobalEnv
).fuente
T
? (¡Además de hacer que el código sea más difícil de leer!)T
oF
internamente la función, y luego fui demasiado vago para cambiarla una vez que me di cuenta de que necesitaba una asignación global.pawl
.Python 3 ,
11299 bytesPruébalo en línea!
Explicación
Editar: Guardado 13 bytes. Gracias, attinat !
fuente
c,=
y soltando[0]
). También vale la pena señalar quechoices
es Python 3.6+05AB1E , 13 bytes
Pruébalo en línea!
Toma la lista de recuentos como entrada. Emite el rollo y los nuevos recuentos.
Explicación:
fuente
JavaScript (ES8), 111 bytes
Pruébalo en línea!
¿Cómo?
Esta es una implementación bastante ingenua y probablemente subóptima que realiza la simulación como se describe.
Realizamos un seguimiento de los recuentos en . En cada rollo, construimos una cadena que consiste en cada dado repitió veces y elegir una entrada al azar en allí con una distribución uniforme.C s i max(C)−Ci+1
fuente
APL (Dyalog Unicode) , SBCS de 32 bytes
-4 bytes usando replicar en lugar de índice de intervalo.
Pruébalo en línea!
Definido como una función que toma la distribución actual como argumento, imprime la tirada resultante y devuelve la distribución actualizada. La primera ejecución en TIO tiene 100 invocaciones comenzando
[0,0,0,0,0,0]
, la segunda ejecución está fuertemente sesgada hacia 1 con[0,100,100,100,100,100]
, y la última ejecución está fuertemente sesgada hacia 6 de la misma manera.fuente
Perl 6 , 31 bytes
Pruébalo en línea!
Acepta la distribución de peso actual como BagHash, comenzando con una donde todos los pesos son 1. La distribución está mutada en el lugar.
El
pick
método BagHash selecciona una clave al azar utilizando los pesos asociados; el peso de esa tecla se reduce en uno. Si ese peso se hace así cero,++«.{1..6}
incrementa los pesos de todos los números 1-6.fuente
Wolfram Language (Mathematica) , 91 bytes
Pruébalo en línea!
fuente
Javascript (ES6 +), 97 bytes
Explicación
Tenga en cuenta que esto eventualmente explotará si
w
excede una longitud de 2 32 -1, que es la longitud máxima de la matriz en js, pero probablemente alcanzará un límite de memoria antes de eso, teniendo en cuenta que una matriz de 32 bits int 32 32 -1 es 16GiB, y algunos navegadores (¿la mayoría?) No le permitirán usar más de 4GiB.fuente
Perl 6 , 49 bytes
Pruébalo en línea!
Toma los rollos anteriores como una bolsa (conjunto múltiple). Devuelve el nuevo rollo y la nueva distribución.
Explicación
fuente
Pyth ,
2220 bytesPruébalo en línea!
La entrada es las frecuencias anteriores como una lista, emite el siguiente rollo y las frecuencias actualizadas separadas por una nueva línea.
fuente
Jalea , 12 bytes
Pruébalo en línea!
Un enlace monádico que toma un solo argumento, la lista de conteo actual, y devuelve una lista del número elegido y la lista de conteo actualizada.
Jalea , 18 bytes
Pruébalo en línea!
Como alternativa, aquí hay un enlace niládico que devuelve el número elegido y realiza un seguimiento de la lista de conteo en el registro.
fuente