Résumé :
- Lancer et écarter en moyenne moins de 2 d20 pour tout autre dé, même d12. C'est bon pour le temps et le critère énoncé du nombre de lancers.
- Diviser et arrondir est plus facile que de travailler sur votre formule, et peut-être plus facile que d'effectuer une opération de type modulo qui est équivalente à votre formule, sauf pour d10 où il suffit de prendre le dernier chiffre. C'est plus idéal pour temps le même nombre de rouleaux.
- l'idée de @superb rain dans les commentaires qui n'a pas encore été intégré dans cette réponse, sauf pour d4 : souvent, un joueur doit lancer plusieurs d6 ou d8 (ou d12) dans le même tour. . Un simple d20 peut nous donner un d8 et un résultat d2 sans corrélation, par exemple, nous permettant d'enchaîner les jets en nous donnant un résultat d8 et un reste d'entropie. Avec des mathématiques astucieuses, nous pouvons même réduire le nombre de jets de d20 par d8 en dessous de 1 lors de jets multiples de d8. Si quelqu'un veut écrire ceci comme une nouvelle réponse, j'en ferai un lien ici.
L'élimination d'échantillons aléatoires est le moyen standard d'éviter les biais lors de la création d'une distribution uniforme à partir d'un RNG qui génère une plage plus large que celle que vous souhaitez, et la plage n'est pas un multiple exact. 1 . C'est simple, facile à retenir et à comprendre, et probablement rapide à mettre en pratique.
Mais de combien de rouleaux aurons-nous besoin en moyenne avec la méthode simple de relance, par exemple en écartant 19 et 20 lorsqu'on essaie de lancer un d6 ? Nombre attendu de relances pour un échantillonnage simple, se défausser et relancer 2 numéros sur 20 pour un d6 (20 mod 6=2), 4 sur 20 pour un d8 (20%8=4), 8 sur 20 pour un d12 (20%12=8).
- d4 : 1.0
- d6 :
sum((2/20)^n, n=0..inf)
= 1.11111...
- d8 :
sum((4/20)^n, n=0..inf)
= 1.25
- d10 : 1.0
- d12 :
sum((8/20)^n, n=0..inf)
= 1.6666...
Ils sont tous inférieurs à 2, même pour le d12. Toute méthode qui toujours lance 2 dés est en moyenne plus de jet que de rebelote. Dans le pire des cas pour les relances (d12), vous n'avez pas à faire de maths (il suffit de prendre le résultat 1..12 du d20) donc le temps total passé pour obtenir un nombre n'est toujours pas mauvais.
La probabilité d'obtenir 19 ou 20 est de 1 sur 10. La probabilité de le refaire est de 1/100, etc. La série 1/10 + 1/100 + 1/1000 + ...
converge vers 0.1111...
des jets de d20 supplémentaires par jet de d6, si ma logique est correcte.
@Rayllum suggère dans les commentaires que au lieu de simplement se débarrasser, changez de stratégie. Par exemple, pour d8, sur 17 20, utilisez-le comme un d4, puis le jet suivant détermine s'il faut ajouter 4 ou non. d4 + 4*d2
stratégie suggérée dans une autre réponse. Cela réduit le nombre moyen de lancers pour un d8 à 1,2, et fixe une limite supérieure stricte de 2. Des astuces similaires sont possibles pour d'autres dés.
Mais au moins, vous n'avez pas à faire de calcul quand vous relancez, seulement sur celui qui est finalement dans la bonne fourchette. Les relances sont "moins chères" que d'autres stratégies à jets multiples parce qu'elles peuvent être effectuées rapidement avec peu d'effort mental et qu'elles utilisent le dé "comme prévu" sans avoir besoin de juger les angles, il suffit de lire la face. Vous devez toujours faire des calculs à la fin sur le résultat d'un seul dé, mais cela peut être plus simple qu'une formule qui implique 2 entrées et de plus grandes valeurs intermédiaires.
Une longue série de jets de d20 élevés peut être amusante en soi, ou simplement frustrante ("où étaient ces jets pour mes attaques / jets de sauvegarde / contrôles ?)
Il est possible que certains joueurs qui n'ont pas surmonté la l'erreur du joueur seraient frustrés de "gaspiller" tous leurs hauts rouleaux en devant les jeter. Le fait d'écarter les jets faibles et de décaler la cartographie rendrait les mathématiques légèrement moins simples (1 étape de soustraction supplémentaire au départ), mais pourrait rendre certains joueurs plus heureux. (que de jeter les rouleaux élevés).
Le défi du cadre : le temps, et pas seulement le nombre de rouleaux, est probablement la vraie préoccupation.
Des réponses astucieuses et originales ont suggéré d'utiliser d'autres propriétés des dés et des angles, mais certaines d'entre elles pourraient allonger la durée de chaque lancer (par exemple, évaluer l'angle et/ou consulter une table de consultation des sommets).
Minimiser la moyenne temps au résultat est probablement un meilleur objectif dans le monde réel que de minimiser le nombre de lancers. Cette partie est un défi de cadre basé sur votre prémisse de post-apocalypse. La question mathématique actuelle de la recherche de rouleaux minimums est également intéressante.
En tenant compte de ce délai, permettez-moi de suggérer une formule plus simple pour faire correspondre les jets de d20 à des plages plus petites . Votre formule basée sur le plancher $$X - B \times \left \lfloor { \frac {X-1}{B}} \right \rfloor $$
est équivalent à 1 + (x-1)%B
un reste de 1..B au lieu de 0..B-1. Par exemple, pour B=4, cela donne 1,2,3,4, 1,2,3,4, etc. Je pense qu'il serait plus facile d'utiliser directement le quotient arrondi. en haut ("plafond").
$$ \left \lceil { \frac {X}{5, 3, \tt or\ 2}} \right \rceil $$
Cela présente l'avantage pour les humains que les chiffres les plus élevés sur le d20 sont les plus élevés sur le d4 / d6 / d8 / d10 / d12.
Par exemple, pour un d4, il est assez intuitif de voir où se situe votre nombre dans les quatre plages 1-5, 6-10, 11-15, 16-20. Cela fonctionne bien car 5 est un facteur de 10, la base numérique que nous avons l'habitude d'utiliser. Ou alors, pensez-y comme suit d20/5
round up.
Malheureusement, nous ne pouvons pas le faire dans les deux sens sur le même d20 pour obtenir 2d4 d'un seul jet. (A moins que vous ne lanciez un lot de d4 et ne se soucient pas de la corrélation). 1 sur le ceil(x/5)
fait 1
sur le 1+(x-1)%4
deux fois plus probable que les autres résultats. Idem pour les autres nombres. (Une cartographie différente pourrait donner une corrélation opposée, rendant les rouleaux plus susceptibles de tendre vers la moyenne plutôt que de s'en éloigner). Vous pourriez faire d20/4
y d20%4
pour 2 résultats d4 indépendants, ou juste 1 si le jet était 17 20. Avec 2 joueurs regardant le même jet de d20, l'un peut totaliser les 1 + (x-1)%4
dans leur tête, et l'autre peut totaliser les ceil(x/4)
ce qui permet à un joueur de gagner du temps pour lancer un projectile magique ou une potion de soin.
Pour un d6, d20/3
L'utilisation de la fonction "round up" n'est probablement pas aussi intuitive pour la plupart des gens, mais je pense que c'est quelque chose que vous pouvez rapidement maîtriser. (A moins que la mécanique d'arrondi de 5e en bas pour la résistance aux dommages conduit à des erreurs fréquentes...) Vous pourriez écrire une table qui est facile à rechercher visuellement parce que l'entrée d20 et la sortie d6 sont toutes deux dans l'ordre croissant.
Pour un d8, divisez par 2 et arrondissez au supérieur (et écartez les jets 17 20). Ou bien utilisez votre formule, qui revient à soustraire 8 ou non pour la moitié supérieure de la fourchette acceptable. C'est également assez simple et évite de "diviser par 2 arrondis vers le haut", ce qui est très proche, mais différent, de la résistance aux dommages standard du 5e diviser par 2 arrondis vers le bas. On en revient probablement à l'expérience qui est mentalement plus facile dans l'ensemble. Ou éliminez 1 et 18 20, puis divisez par 2 en arrondissant à l'inférieur.
Pour un d10, votre méthode revient à ignorer le premier chiffre (en traitant 0 comme 10) qui devrait être très rapide et intuitive (et moins de risque d'erreur) que de diviser par 2 arrondis vers le haut. Évite également les conflits de mémoire numérique pour la résistance aux dommages = diviser par 2 arrondir au chiffre inférieur.
Pour un d12, c'est un calcul trivial ("diviser par 1"). Le seul coût est celui d'un plus grand nombre de relances attendues/moyennes.
Note de bas de page 1 : En programmation informatique, rand() % 12
n'a qu'un biais minime et peut être "suffisamment bonne" lorsque rand()
peut produire des nombres jusqu'à 2^32-1, mais un énorme biais quand il produit des nombres de 0..19. Cela produirait un nombre aléatoire de 0 à 11, mais pas uniformément distribué. Les nombres 0..7 apparaîtraient deux fois plus souvent que 8..11.
De même, rand() / (RAND_MAX/12)
a un mauvais biais pour les petits nombres comme 12, car l'intervalle n'est pas divisible de manière égale en 12 morceaux de taille égale.
Je ne le mentionne que pour souligner que ce problème est fondamentalement similaire à un autre qui a été étudié de manière approfondie pour l'informatique. En le faisant à la main, et avec de petites plages, les compromis sont différents.