J'ai un générateur de nombres aléatoires qui fonctionne en temps constant.Nombre aléatoire à temps constant dans la plage
Le prototype de cette fonction est la suivante:
uint8_t rand();
Ce que je veux être en mesure de faire est de créer une fonction qui renvoie au hasard un uint8_t de telle sorte que la sortie est comprise entre 0 et max où max est la nombre maximum à renvoyer. Le prototype d'une telle fonction est le suivant:
uint8_t randi(uint8_t max);
Il existe des algorithmes en ligne pour ce faire et en cas de débordement de pile. Par exemple, https://stackoverflow.com/a/6852396/1444313. Mais mon problème est que je veux y parvenir à temps constant. Je ne peux trouver aucune méthode qui fait cela à temps constant.
De plus, je cours sur un ARM Cortex-m0 sans division matérielle donc l'utilisation de l'opérateur% n'est pas possible.
Quelqu'un at-il des suggestions ou des indications sur la façon dont j'y arriverais en temps constant?
Merci
Je ne vois pas le problème, toute implémentation à distance plausible de la division logicielle d'entiers de longueur constante aura une complexité temporelle constante. Les facteurs constants peuvent cependant être un peu plus élevés que les alternatives, dont la solution la plus simple est d'inverser le processus et de multiplier 'max' puis de diviser par la constante' MAX' (dans la précision de uint64_t si nécessaire). L'avantage est que la division par une constante peut facilement être optimisée en une simple opération de multiplication/décalage/ajout par le compilateur dans le pire des cas, ou manuellement si vous ne faites pas confiance à l'optimiseur. – doynax
Lien xkcd obligatoire: https: // xkcd.com/221/ – pmg
@doynax Je ne suis pas sûr de comprendre votre méthode d'après votre explication, pourriez-vous écrire une réponse si vous pensez que cela fonctionnerait? Merci. –