Quels algorithmes sont utilisés pour des C rand()?
Je comprends que le C les spécifications ne donne aucune spécification sur la mise en œuvre spécifique de rand()
. Quels sont les différents algorithmes sont couramment utilisés sur les différentes plates-formes? En quoi diffèrent-elles?
- Le premier commentaire est que rand() n'est pseudo-aléatoire, et souvent même pas d'un très bon générateur pseudo-aléatoire. Le C standard suggère une possible mise en œuvre, et beaucoup de mise en œuvre de l'utiliser. Comme d'autres l'ont noté, il y a beaucoup d'autres. Juste s'assurer que vous n'utilisez pas la base de fonctions aléatoires pour les situations où vous avez besoin de chiffrement aléatoire.
Vous devez vous connecter pour publier un commentaire.
Voir cet article: http://en.wikipedia.org/wiki/List_of_random_number_generators
C'est le code source de la glibc
rand()
:Source: https://sourceware.org/git/?p=glibc.git;a=blob_plain;f=stdlib/rand_r.c;hb=la TÊTE
Comme vous pouvez le voir, il suffit de multiplier avec une addition et d'une maj. Les valeurs sont choisies avec soin pour vous assurer que vous n'obtenez pas de répétition de la sortie de RAND_MAX itérations.
Noter que c'est un vieux de la mise en œuvre qui a été remplacé par un algorithme plus complexe: https://sourceware.org/git/?p=glibc.git;a=blob_plain;f=stdlib/random_r.c;hb=la TÊTE
Si le lien en cas de bris, de Google pour "glibc rand_r"
*+<<
trois fois.Une fois, j'ai écrit un rapport sur CRNGs pour un cours en Mathématiques Discrètes. Pour cela, j'ai démonté rand() dans msvcrt.dll:
C'est donc un LCG quelque chose comme (non testé)...
Le domaine de la PRNGs (Générateurs de nombres Pseudo Aléatoires) est très vaste.
Tout d'abord, vous devez comprendre que sans avoir une entrée externe (généralement physiques), vous ne pouvez pas obtenir une véritable source de nombres aléatoires.. C'est pourquoi ces algorithmes sont appelés pseudo-aléatoire: généralement, ils utilisent une graine d'initialiser une position dans une séquence très longue qui semble aléatoire, mais ce n'est pas aléatoire du tout.
L'un des plus simple des algorithmes est le Générateur Linéaire à Congruence (LCG), qui a une certaine costraints pour garantir une longue séquence et il n'est pas sûr du tout.
Autre drôle de l'une (au moins pour le nom) est l'Blum Blum Shub Générateur ( BBS ), ce qui est inhabituel pour la normale PRNGs parce qu'il s'appuie sur l'exponentiation dans l'arithmétique modulo donner une sécurité comparable à d'autres algorithmes tels que RSA et El Gamal la rupture de la séquence (même si je ne suis pas sûr au sujet de la preuve)
Vous pourriez utiliser l'amplification Aléatoire de la bibliothèque pour les différents générateurs de nombres aléatoires, si vous avez besoin de quelque chose de précis, ou pour les plus avancés.
La documentation de Boost Aléatoire est ici.