Le sophisme du joueur est un biais cognitif où nous nous attendons à tort à ce que les événements qui se sont produits soient moins susceptibles de se produire à l'avenir et les événements qui ne se sont pas produits depuis longtemps soient plus susceptibles de se produire bientôt. Votre tâche consiste à implémenter une version spécifique de cela.
Explication du défi
Écrivez une fonction qui renvoie un entier aléatoire compris entre 1 et 6, inclus. Le hic: la première fois que la fonction est exécutée, le résultat doit être uniforme (à moins de 1%), cependant, chaque appel suivant sera faussé en faveur de valeurs qui ont été roulées moins de fois auparavant. Les détails spécifiques sont les suivants:
- Le dé se souvient du nombre de nombres générés jusqu'à présent.
- Chaque résultat est pondéré avec la formule suivante:
- Par exemple, si le nombre de rouleaux jusqu'à présent est , les poids seront , c'est-à-dire que vous serez 4 fois plus susceptibles de lancer un qu'un .
- Notez que la formule signifie qu'un résultat de roulis de est pondéré de la même façon que
Règles et hypothèses
- Les règles d'E / S standard et les failles interdites s'appliquent
- Les lancers ne doivent pas être déterministes. (c.-à-d. utiliser un PRNG issu d'une source volatile, comme cela est généralement disponible en tant que module intégré.)
- Votre source aléatoire doit avoir une période d'au moins 65535 ou être un vrai hasard.
- Les distributions doivent être inférieures à 1% pour les poids jusqu'à 255
- Les RNG 16 bits sont suffisamment bons pour répondre aux deux exigences ci-dessus. La plupart des RNG intégrés sont suffisants.
- Vous pouvez transmettre la distribution actuelle tant que cette distribution est mutée par l'appel ou que la distribution post-roll est renvoyée avec le dé. La mise à jour de la distribution / des comptages fait partie de ce défi .
- Vous pouvez utiliser des poids au lieu de comptes. Ce faisant, chaque fois qu'un poids tombe à 0, tous les poids doivent augmenter de 1 pour obtenir le même effet que le stockage des comptes.
- Vous pouvez utiliser ces poids comme répétitions d'éléments dans un tableau.
Bonne chance. Que les octets soient toujours en votre faveur.
Réponses:
R , 59 octets
Essayez-le en ligne!
Conserve les décomptes dans
T
, qui est ensuite transformé pour être utilisé commeweights
argumentsample
(qui les normalise alors très probablement pour additionner1
).L'
[<<-
opérateur est utilisé pour attribuer une valeur àT
dans l'un des environnements parents (dans ce cas, le seul environnement parent est.GlobalEnv
).la source
T
? (En plus de rendre le code plus difficile à lire!)T
ou enF
interne, puis j'étais trop paresseux pour la changer une fois que j'ai réalisé que j'avais besoin d'une affectation globale.pawl
.Python 3 ,
11299 octetsEssayez-le en ligne!
Explication
Modifier: enregistré 13 octets. Merci, attinat !
la source
c,=
et la suppression[0]
) de tuple . Il convient également de noter quechoices
Python 3.6+05AB1E , 13 octets
Essayez-le en ligne!
Prend la liste des comptes en entrée. Sort le rouleau et les nouveaux comptes.
Explication:
la source
JavaScript (ES8), 111 octets
Essayez-le en ligne!
Comment?
Il s'agit d'une implémentation plutôt naïve et probablement sous-optimale qui effectue la simulation comme décrit.
la source
APL (Dyalog Unicode) , 32 octets SBCS
-4 octets utilisant la réplication au lieu de l'index d'intervalle.
Essayez-le en ligne!
Défini comme une fonction qui prend la distribution actuelle comme argument, imprime le jet de dé résultant et renvoie la distribution mise à jour. La première exécution sur TIO est de 100 appels commençant par
[0,0,0,0,0,0]
, la deuxième exécution est fortement biaisée vers 1 avec[0,100,100,100,100,100]
, et la dernière exécution est fortement biaisée vers 6 de la même manière.la source
Perl 6 , 31 octets
Essayez-le en ligne!
Accepte la distribution de poids actuelle en tant que BagHash, en commençant par celle où tous les poids sont 1. La distribution est mutée sur place.
La
pick
méthode BagHash sélectionne une clé au hasard en utilisant les poids associés; le poids de cette clé est alors décrémenté de un. Si ce poids est ainsi mis à zéro,++«.{1..6}
incrémente les poids de tous les nombres 1-6.la source
Wolfram Language (Mathematica) , 91 octets
Essayez-le en ligne!
la source
Javascript (ES6 +), 97 octets
Explication
Notez que cela finira par exploser s'il
w
dépasse une longueur de 2 32 -1, qui est la longueur maximale du tableau en js, mais vous atteindrez probablement une limite de mémoire avant cela, étant donné qu'un tableau int 32 bits de 2 32 -1 est long 16GiB, et certains navigateurs (la plupart?) Ne vous permettront pas d'utiliser plus de 4GiB.la source
Perl 6 , 49 octets
Essayez-le en ligne!
Prend les rouleaux précédents comme un sac (multiset). Renvoie le nouveau rouleau et la nouvelle distribution.
Explication
la source
Pyth ,
2220 octetsEssayez-le en ligne!
L'entrée est les fréquences précédentes sous forme de liste, les sorties du rouleau suivant et les fréquences mises à jour séparées par une nouvelle ligne.
la source
Gelée , 12 octets
Essayez-le en ligne!
Un lien monadique qui prend un seul argument, la liste de comptage actuelle, et renvoie une liste du nombre choisi et la liste de comptage mise à jour.
Gelée , 18 octets
Essayez-le en ligne!
Comme alternative, voici un lien niladique qui retourne le nombre choisi et garde une trace de la liste de comptage dans le registre.
la source