[C] Problème routine génération nombres aléatoires
Publié : 21 juil. 2021 11:07
Salut à tous,
Petite question... Toujours en parallèle de mes développements en C sur la Vectrex, j'aurais besoin de vos lumières concernant la génération de nombres pseudo-aléatoires.
J'ai à ma disposition deux fonctions dans la ROM :
Mon souci est que la fonction random() me renvoie un entier signé 8 bits, donc entre -128 et +127, et que j'aimerai pouvoir "affiner" la plage de rendu des valeurs pour obtenir des entiers signés entre A et B. (toujours dans la plage entier signé 8 bits).
Seulement voilà j'aimerai savoir comment faire ça proprement. Impossible de passer en flottant sur cette machine (le compilateur ne les gère pas) et passer sur des entiers 16 bits est assez lent (et me semble un peu trop surdimensionné).
Pour me dépanner j'ai fait une table avec 255 entrées, mais c'est lourd en ROM et pas très propre au final.
Les solutions trouvées lors de mes recherches faisaient quasi toutes appel à des flottants, genre :
Il semble en plus que le générateur de nombres aléatoires du bios de la Vectrex ne soit pas si bon que ça.
Je peux éventuellement repartir sur des algos indépendants de toute bibliothèque, mais rien trouvé pour l'instant...
Des idées ?
Merci !
(PS : je ne sais pas si je suis dans le bon topic... N'hésitez pas à déplacer au besoin)
Petite question... Toujours en parallèle de mes développements en C sur la Vectrex, j'aurais besoin de vos lumières concernant la génération de nombres pseudo-aléatoires.
J'ai à ma disposition deux fonctions dans la ROM :
Bon déjà pas de bol, le simple fait d'appeler la fonction random_seed fait qu'ensuite tout appel à la fonction random() renvoie toujours le même nombre . On arrive à avoir des résultats différents en ne l'appelant pas. (bon why not...). Bref.// The Vectrex uses three bytes for the random seed.
void random_seed(uint8_t seed1, uint8_t seed2, uint8_t seed3);
// Produce a random value using the BIOS Random function.
int8_t random();
Mon souci est que la fonction random() me renvoie un entier signé 8 bits, donc entre -128 et +127, et que j'aimerai pouvoir "affiner" la plage de rendu des valeurs pour obtenir des entiers signés entre A et B. (toujours dans la plage entier signé 8 bits).
Seulement voilà j'aimerai savoir comment faire ça proprement. Impossible de passer en flottant sur cette machine (le compilateur ne les gère pas) et passer sur des entiers 16 bits est assez lent (et me semble un peu trop surdimensionné).
Pour me dépanner j'ai fait une table avec 255 entrées, mais c'est lourd en ROM et pas très propre au final.
Les solutions trouvées lors de mes recherches faisaient quasi toutes appel à des flottants, genre :
Code : Tout sélectionner
rand() % (max_number + 1 - minimum_number) + minimum_number
Je peux éventuellement repartir sur des algos indépendants de toute bibliothèque, mais rien trouvé pour l'instant...
Des idées ?
Merci !
(PS : je ne sais pas si je suis dans le bon topic... N'hésitez pas à déplacer au besoin)