Supposons que j'ai un n -un dé chargé sur une face, où chaque face k a une certaine probabilité p <em>k </em> d'apparaître quand je le roule. Je suis curieux de savoir s'il existe une bonne structure de données pour stocker ces informations de manière statique (c'est-à-dire pour un ensemble fixe de probabilités), afin de pouvoir simuler efficacement un lancer de dé aléatoire.
Actuellement, j'ai un programme O(lg n ) pour résoudre ce problème. L'idée est de stocker un tableau de la probabilité cumulative de la première k côtés pour tous k puis générer un nombre réel aléatoire dans la plage [0, 1] et effectuer une recherche binaire sur la table pour obtenir le plus grand indice dont la valeur cumulée n'est pas supérieure à la valeur choisie.
J'aime assez 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é sort toujours ou que les valeurs sont uniformément distribuées, il est possible de générer le résultat du jet en O(1) en utilisant une approche naïve, alors que ma solution prendra toujours un nombre logarithmique de pas.
Quelqu'un a-t-il des suggestions sur la façon de résoudre ce problème d'une manière qui soit en quelque sorte "adaptative" dans son exécution ?
Mise à jour : 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 de la méthode des alias par Vose donne ( n ) de prétraitement et O(1) de temps par jet de dé, ce qui est vraiment impressionnant. J'espère que cela constitue un complément utile aux informations contenues dans les réponses !
2 votes
Il est raisonnable de penser qu'il existe une solution O(1) pour chaque cas spécifique .