introduction
Vous obtenez un générateur d'entiers aléatoires avec l'implémentation suivante
- La première invocation renvoie toujours 1.
- La deuxième invocation renvoie un entier aléatoire compris entre 1 et 2.
- La troisième invocation renvoie un entier aléatoire compris entre 1 et 3.
- La nième invocation renvoie un entier aléatoire compris entre 1 et n, inclus.
Sur la base de la fonction ci-dessus, écrivez un générateur de dés aléatoire parfaitement aléatoire, renvoyant une valeur comprise entre 1 et 6 (inclus) avec une probabilité égale.
Règles
- Votre programme / fonction doit résulter en un entier aléatoire compris entre 1 et 6, inclus, sous une forme utilisable, c'est-à-dire vers une sortie standard ou comme valeur de retour de fonction.
- Le générateur de nombres aléatoires ascendants ci-dessus peut être défini comme une fonction "libre" dans votre programme (c'est-à-dire qu'il ne compte pas dans le nombre de caractères), ou un script / programme distinct qui est exécuté selon les besoins, en supposant que l'état (
n
) est persistant entre les appels. - Supposons que pas plus de 1000 lancers de dés ne seront jamais demandés dans un seul cas d'utilisation de votre programme, et le générateur de nombres aléatoires initial peut être réinitialisé
1
à la fin de 1000 lancers de dés pour éviter un débordement den
. - Votre programme ne peut utiliser aucune autre source de nombres aléatoires à l'exception du générateur aléatoire ascendant défini ci-dessus. Vous pouvez bien sûr demander plusieurs nombres aléatoires au générateur de nombres aléatoires pour chaque sortie de jet de dés.
- Il s'agit de code-golf, donc le gagnant est la réponse la plus courte ou la plupart des votes en cas d'égalité. Si vous pouvez générer 1000 lancers de dés en utilisant moins de 1000 nombres aléatoires générés, offrez-vous un bonus d'efficacité de 10 points .
Exemple
./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
illégal ou ne fonctionne-t-il pas? Je peux mal comprendre la troisième règle.Réponses:
J - 13 caractères
Cela fait les mêmes hypothèses que Golfscript: que le nombre de dés est en stdin et nous listons les lancers de dés qui doivent sortir.
Expliqué par l'explosion:
Si cela n'est pas satisfaisant, voici un programme plus long de 21 caractères, qui peut être appelé
f''
pour générer des nombres aléatoires, avec un état et tout.la source
r:{*1_draw x}
, version stdin (10 caractères)r'1+!. 0:`
, version fonction (14 caractères)c:0;f:{r@c+:1}
appelée parf[]
.Python, 31 caractères
De la même manière que pour scleaver, définissez le générateur comme ceci:
Puis une fonction pour retourner les lancers de dés:
Appelez
D()
chaque fois que vous avez besoin d'un lancer de dés uniformément aléatoire.la source
Scala 23
La méthode r peut être (approximativement) implémentée comme ceci:
un test approximatif:
Chaque 6ème appel devrait produire une distribution égale sur les 6 valeurs, donc je jette 5.
la source
GolfScript (15 caractères)
Cela suppose que le nombre de rouleaux requis est fourni sur stdin et répertorie ce nombre de résultats à stdout.
Démo en ligne
Bien que je puisse obtenir le bonus de 10 points pour l'utilisation de moins de 1000 rouleaux pour générer 1000 numéros, cela me coûterait bien plus de 10 caractères. L'approche triviale d'extraire l'entropie appropriée lorsque N est un multiple d'une puissance de 2 ou 3 est bien en deçà car le nombre de résultats disponibles mod 3 n'est que de 333 + 111 + 37 + 12 + 4 + 1 = 498. Il est donc nécessaire de adopter une approche d'échantillonnage et de rejet. En utilisant cette approche, vous pouvez obtenir un 2242 rouleaux attendus de 1000 appels à
r
, mais il y a des frais supplémentaires de la comptabilité etbase
c'est un nom de fonction très long.la source
base
est un nom de fonction très long" Vous n'utilisez apparemment pas Mathematica . Nous obtenons des merveilles commeNegativeBinomialDistribution
,ExponentialGeneratingFunction
,MathieuCharacteristicExponent
,InverseFourierSequenceTransform
etSemialgebraicComponentInstances
. :-)Python
6563La fonction
R()
est le randomiseur ascendant.Usage:
la source
for
boucle et appelerR
une seule fois avant votrewhile
boucle?R()
renvoyer un flotteur et vous saisissiez le chiffre le moins significatif. Maintenant qu'il a été précisé queR()
renvoie un entier, cela a du sens.Python, 56
r est défini comme:
le générateur de dés d:
utilisation, par exemple, pour 100 rouleaux:
la source
import math
si vous le remplacezmath.ceil(...)
parint(...)+1
Mathematica 51
Le générateur de nombres aléatoires,,
r
est réinitialisé en définissant la variable globalen
sur 1.Code
Pas en lice pour le code le plus court ...
Usage
60000 lancers de dés ont nécessité 60031 appels vers
h
.Tally
montre la répartition par numéros 1-6.la source
Perl, 22 ou 45
Implémentation du générateur de nombres aléatoires ascendants:
Générateur:
Test:
la source
JavaScript (Node.js) , 35 octets
Essayez-le en ligne!
la source
opcode x86, 15 octets
la source
GolfScript , 8 octets
Essayez-le en ligne!
Il fait éclater le générateur une fois, puis se débarrasse du résultat. Ensuite, il lance f2 et le multiplie par 3 (3 ou 6), puis soustrait f3-1 (0, 1, 2), ce qui donne (3-2, 3-1, 3-0) ou (6-2, 6-1, 6-0) W5.
Golfscript et la fonction aléatoire existaient avant la publication de cette question, tout comme la soumission légale.
Il s'agit de la soumission à exécution unique. Si vous devez l'exécuter plusieurs fois en un seul appel,
GolfScript , 12 octets
Essayez-le en ligne!
Cela réinitialise votre appel i à 0 afin de le réinitialiser en conséquence. Ce TIO montre 50 résultats aléatoires.
la source
C (gcc) , 31 octets
Tous les 6 appels, la probabilité que chaque nombre compris entre 1 et 6 inclus soit généré est égale.
c
est#define
d comme un appel à une fonction qui génère les nombres aléatoires parfaits.Essayez-le en ligne!
la source