Générateur de nombres aléatoires simples et spéciaux
Comment créer une fonction qui à chaque appel génère de façon aléatoire un nombre entier? Ce nombre doit être le plus aléatoire possible (en fonction distribution uniforme). Il n'est autorisé à utiliser une variable statique, et d'au plus 3 étapes élémentaires, où chaque étape se compose d'une seule opération arithmétique de base de arité 1 ou 2.
Exemple:
int myrandom(void){
static int x;
x = some_step1;
x = some_step2;
x = some_step3;
return x;
}
Des opérations arithmétiques de base sont +,-,%,and, not, xor, ou vers la gauche maj, maj de droite, de multiplication et de division. Bien sûr, pas de rand(), random() ou les trucs similaires est autorisé.
source d'informationauteur psihodelia
Vous devez vous connecter pour publier un commentaire.
la Générateur Linéaire à Congruence est l'un de la plus ancienne et la plus simple méthode:
Ony quelques-uns de l'enseignement, avec des opérations arithmétiques de base, c'est ce que vous avez besoin.
L'esprit que cet algorithme fonctionne très bien seulement si
a
c
etm
sont choisis d'une manière particulière!Pour garantir la longue durée de cette séquence c et m doivent être premiers entre eux, a-1 doit être divisible par tous les facteurs premiers de m et aussi pour 4 si m est divisible par 4.
Quelques exemples de valeurs sont indiquées dans les Wikipedia: par exemple le C ANSI pour certains compilateurs propose
m = 2^32
a = 1103515245
etc = 12345
La graine ne peut pas être 0. Source: http://www.javamex.com/tutorials/random_numbers/xorshift.shtml#.VlcaYzKwEV8
Complément d'info dans le wiki: https://en.wikipedia.org/wiki/Xorshift
Vous pourriez avoir un coup d'oeil à cette. C'est loin d'être un "parfait" générateur de nombre aléatoire, mais il ne répondent à vos exigences, aussi loin que je peux voir.
Ici vous pouvez trouver des informations supplémentaires sur la génération de nombre aléatoire.
Si j'écris
man rand
je peux lire un exemple possible, donné dans POSIX.1-2001, pour la mise en œuvre de rand() et srand(). Voir, par exemple,ici. Si vous avez besoin de quelque chose de plus sophistiqué, jetez un oeil à Bibliothèque Scientifique GNU; vous pouvez bien sûr télécharger le code et de voir la mise en œuvre(s).Boost a une très belle aléatoire de nombre de la bibliothèque, et le code source est disponible, de sorte que vous pourriez essayer de regarder et d'utiliser ce que vous avez besoin (c'est à dire couper et coller).
Voici une fonction avec une distribution uniforme sur l'ensemble de la gamme de int:
- Je utiliser ce
Un gros gain de l'aléatoire peut être réalisé sans avoir à dépenser plus de temps de calcul création d'un générateur de nombre aléatoire pour chaque appel, le générateur de nombre aléatoire dans le cadre du programme.
C'est une très bonne astuce!