Introducción
Se le proporciona un generador de enteros aleatorio con la siguiente implementación
- La primera invocación siempre devuelve 1.
- La segunda invocación devuelve un entero aleatorio entre 1 y 2.
- La tercera invocación devuelve un entero aleatorio entre 1 y 3.
- La enésima invocación devuelve un entero aleatorio entre 1 yn, inclusive.
Con base en la función anterior, escriba un generador de dados aleatorio que sea perfectamente aleatorio, devolviendo un valor entre 1 y 6 (inclusive) con igual probabilidad.
Reglas
- Su programa / función debe dar como resultado un número entero aleatorio entre 1 y 6, inclusive, en alguna forma utilizable, es decir, a la salida estándar o como un valor de retorno de la función.
- El generador de números aleatorios ascendentes anterior se puede definir como una función "libre" en su programa (es decir, no cuenta para su recuento de caracteres), o un script / programa separado que se ejecuta según sea necesario, suponiendo que el estado (
n
) sea persistente entre llamadas. - Suponga que nunca se solicitarán más de 1000 tiradas de dados en un solo caso de uso de su programa, y el generador inicial de números aleatorios puede reiniciarse al
1
final de 1000 tiradas de dados para evitar el desbordamienton
. - Su programa no puede usar ninguna otra fuente de números aleatorios, excepto el generador aleatorio ascendente definido anteriormente. Por supuesto, puede solicitar múltiples números aleatorios del generador de números aleatorios para cada salida de tirada de dados.
- Este es el código de golf, por lo que el ganador es la respuesta más corta o la mayoría de los votos en caso de empate. Si puedes generar 1000 tiradas de dados usando menos de 1000 números aleatorios generados, obtén un bono de eficiencia de 10 puntos .
Ejemplo
./asc-rand
1 # random integer between 1 and 1
./asc-rand
1 # random integer between 1 and 2
./asc-rand
3 # random integer between 1 and 3
./asc-rand
4 # random integer between 1 and 4
# dice-gen generates random dice based on output of asc-rand program.
./dice-gen
3
./dice-gen
6
./dice-gen
5
./dice-gen
1
iterate(6):b=asc-rand(); print b
ilegal o no funciona? Podría estar malinterpretando la tercera regla.Respuestas:
J - 13 char
Esto hace las mismas suposiciones que Golfscript: que la cantidad de dados está en stdin y enumeramos las tiradas de dados que saldrán.
Explicado por explosión:
Si eso es de alguna manera insatisfactorio, aquí hay un programa más largo de 21 caracteres, al que se puede llamar
f''
para generar números aleatorios, con un estado y todo.fuente
r:{*1_draw x}
, versión estándar (10 caracteres)r'1+!. 0:`
, versión de función (14 caracteres)c:0;f:{r@c+:1}
llamada porf[]
.Python, 31 caracteres
De manera similar a Scleaver, defina el generador de esta manera:
Luego, una función para devolver tiradas de dados:
Llame
D()
cada vez que necesite una tirada de dados uniforme al azar.fuente
Scala 23
El método r se puede implementar (aprox.) De esta manera:
una prueba aproximada:
Cada sexta llamada debería producir una distribución igual sobre los 6 valores, por lo que descarto 5.
fuente
GolfScript (15 caracteres)
Esto supone que el número de rollos requeridos se proporciona en stdin y enumera tantos resultados para stdout.
Demostración en línea
Si bien podría obtener la bonificación de 10 puntos por usar menos de 1000 tiradas para generar 1000 números, me costaría mucho más de 10 caracteres. El enfoque trivial de extraer la entropía adecuada cuando N es un múltiplo de una potencia de 2 o 3 se queda muy corto porque el número de resultados disponibles mod 3 es solo 333 + 111 + 37 + 12 + 4 + 1 = 498. Por lo tanto, es necesario adopte un enfoque de muestra y rechazo. Usando este enfoque, puede obtener 2242 rollos esperados de 1000 llamadas a
r
, pero hay una sobrecarga adicional de la contabilidad ybase
es un nombre de función muy largo.fuente
base
es un nombre de función muy largo" Aparentemente no usa Mathematica . Obtenemos maravillas tales comoNegativeBinomialDistribution
,ExponentialGeneratingFunction
,MathieuCharacteristicExponent
,InverseFourierSequenceTransform
, ySemialgebraicComponentInstances
. :-)Python
6563La función
R()
es el aleatorizador ascendente.Uso:
fuente
for
bucle y simplemente llamarR
una vez antes de suwhile
bucle?R()
estaba devolviendo un flotador y que estabas agarrando el dígito menos significativo. Ahora que se ha aclarado queR()
devuelve un número entero, tiene sentido.Python, 56
r se define como:
el generador de dados d:
uso, por ejemplo, para 100 rollos:
fuente
import math
si lo reemplazamath.ceil(...)
conint(...)+1
Mathematica 51
El generador de números aleatorios
r
, se restablece estableciendo la variable global,n
a 1.Código
No en la carrera por el código más corto ...
Uso
60000 lanzamientos de dados requieren 60031 llamadas a
h
.Tally
muestra el desglose por los números 1-6.fuente
Perl, 22 o 45
Implementación del generador de números aleatorios ascendentes:
Generando:
Prueba:
fuente
JavaScript (Node.js) , 35 bytes
Pruébalo en línea!
fuente
código de operación x86, 15 bytes
fuente
GolfScript , 8 bytes
Pruébalo en línea!
Hace estallar el generador una vez, luego se deshace del resultado. Luego tira f2, y lo multiplica por 3 (3 o 6), luego resta f3-1 (0, 1, 2) que resulta en (3-2, 3-1, 3-0) o (6-2, 6-1, 6-0) W5.
Golfscript y la función aleatoria existían antes de que se publicara esta pregunta, por lo que es una presentación legal.
Este es el envío de solo una vez. Si necesita ejecutarlo varias veces en una sola llamada,
GolfScript , 12 bytes
Pruébalo en línea!
Esto restablece su llamada a 0, por lo que se restablece en consecuencia. Este TIO muestra 50 resultados aleatorios.
fuente
C (gcc) , 31 bytes
Cada 6 llamadas, la probabilidad de que se genere cada número entre 1 y 6 inclusive es igual.
c
es#define
d como una llamada a una función que genera los números aleatorios perfectos.Pruébalo en línea!
fuente