Supposons que j'ai un dé chargé à n côtés où chaque côté k a une certaine probabilité p k de remonter quand je le lance. Je suis curieux de savoir s'il existe un bon algorithme pour stocker ces informations de manière statique (c'est-à-dire pour un ensemble fixe de probabilités) afin de pouvoir simuler efficacement un jet aléatoire du dé.
Actuellement, j'ai une solution O (lg n) pour ce problème. L'idée est de stocker une table de la probabilité cumulée des k premiers côtés pour tous les k, de générer un nombre réel aléatoire dans la plage [0, 1) et d'effectuer une recherche binaire sur la table pour obtenir le plus grand index dont le cumul la valeur n'est pas supérieure à la valeur choisie. J'aime plutôt cette solution, mais il semble étrange que le runtime ne prenne pas en compte les probabilités. En particulier, dans les cas extrêmes où un côté monte toujours ou que les valeurs sont uniformément réparties, il est possible de générer le résultat du roulement dans O (1) en utilisant une approche naïve, bien que ma solution prendra toujours logarithmicallh de nombreuses étapes.
Quelqu'un at-il des suggestions sur la façon de résoudre ce problème d'une manière qui est en quelque sorte «adaptative» dans son exécution?
EDIT : Sur la base des réponses à cette question, j'ai rédigé un article décrivant de nombreuses approches de ce problème , ainsi que leurs analyses. Il semble que l'implémentation par Vose de la méthode d'alias donne Θ (n) temps de prétraitement et O (1) temps par jet de dé, ce qui est vraiment impressionnant. J'espère que c'est un ajout utile aux informations contenues dans les réponses!