drand48, erand48, jrand48, lcong48, lrand48, mrand48, nrand48, seed48ou srand48 Sous-routine
Objectif
Générez des séquences de nombres pseudo-aléatoires distribuées uniformément.
Bibliothèque
Bibliothèque C standard (libc.a)
Syntaxe
#include <stdlib.h> double drand48 (void) unsigned short int xsubi[3];
long int jrand48 (xsubi)
unsigned short int xsubi[3]; unsigned short int Parameter[7];
long int lrand48 (void) long int mrand48 (void) long int nrand48 (xsubi)
unsigned short int xsubi[3]; unsigned short int Seed16v[3];
long int SeedValue;
Descriptif
Attention: N'utilisez pas la sous-routine drand48, erand48, jrand48, lcong48, lrand48, mrand48, nrand48, seed48ou srand48 dans un environnement à unités d'exécution multiples.
Cette famille de sous-programmes génère des nombres pseudo-aléatoires à l'aide de l'algorithme congruentiel linéaire et de l'arithmétique entière de 48 bits.
La sous-routine drand48 et la sous-routine erand48 renvoient des valeurs en virgule flottante à double précision positives uniformément réparties sur l'intervalle [0.0, 1.0).
La sous-routine lrand48 et la sous-routine nrand48 renvoient des entiers longs positifs uniformément répartis sur l'intervalle [ 0,2 * *31 ].
Les sous-programmes mrand48 et jrand48 renvoient des entiers longs signés uniformément répartis sur l'intervalle [-2, 2**31].
La sous-routine srand48 , la sous-routine seed48 et la sous-routine lcong48 initialisent le générateur de nombres aléatoires. Les programmes doivent appeler l'un d'entre eux avant d'appeler les sous-routines drand48, lrand48 ou mrand48 . (Bien que cela ne soit pas recommandé, les valeurs d'initialiseur par défaut constantes sont fournies si les sous-routines drand48, lrand48 ou mrand48 sont appelées sans appeler au préalable une sous-routine d'initialisation.) Les sous-routines erand48, nrand48et jrand48 ne nécessitent pas qu'une sous-routine d'initialisation soit appelée en premier.
La valeur précédente indiquée par la sous-routine seed48 est stockée dans une mémoire tampon interne 48 bits et un pointeur vers la mémoire tampon est renvoyé par la sous-routine seed48 . Ce pointeur peut être ignoré s'il n'est pas nécessaire, ou il peut être utilisé pour permettre à un programme de redémarrer à partir d'un point donné ultérieurement. Dans ce cas, le pointeur est accessible pour extraire et stocker la dernière valeur pointée par la sous-routine seed48 , puis cette valeur est utilisée pour la réinitialisation, à l'aide de la sous-routine seed48 , lorsque le programme est redémarré.
Toutes les sous-routines fonctionnent en générant une séquence de valeurs entières de 48 bits, x[i],selon la formule congruentielle linéaire:
x[n+1] = (ax[n] + c)mod m, n is > = 0Le paramètre m = 248 ; par conséquent, l'arithmétique des entiers sur 48 bits est effectuée. A moins que la sous-routine lcong48 n'ait été appelée, la valeur de multiplicateur a et la valeur d'ajout c sont les suivantes:
a = 5DEECE66D base 16 = 273673163155 base 8 c = B base 16 = 13 base 8Paramètres
| Article | Descriptif |
|---|---|
| xsubi | Indique un tableau de trois courts-métrages qui, lorsqu'ils sont concaténés, forment un entier de 48 bits. |
| SeedValue | Indique la valeur d'initialisation pour commencer la randomisation. La modification de cette valeur modifie le modèle de randomisation. |
| Seed16v | Indique une autre valeur de départ ; un tableau de trois courts-métrages non signés qui forment une valeur de départ de 48 bits. |
| Paramètre | Indique un tableau de sept shorts, qui spécifie la valeur xsubi initiale, la valeur de multiplicateur a et la valeur d'extension c. |
Valeurs renvoyées
La valeur renvoyée par les sous-routines drand48, erand48, jrand48, lrand48, nrand48et mrand48 est calculée en générant d'abord les x[i] 48 bits suivants dans la séquence. Ensuite, le nombre de bits approprié, en fonction du type d'élément de données à renvoyer, est copié à partir des bits de poids fort (de poids fort) de x[i] et transformé en valeur renvoyée.
Les sous-routines drand48, lrand48et mrand48 stockent les derniers x[i] 48 bits générés dans une mémoire tampon interne ; c'est pourquoi elles doivent être initialisées avant d'être appelées.
Les sous-routines erand48, jrand48et nrand48 nécessitent que le programme appelant fournisse de la mémoire pour les valeurs x[i] successives du tableau désigné par le paramètre xsubi . C'est pourquoi ces routines n'ont pas besoin d'être initialisées ; le programme appelant place la valeur initiale souhaitée de x[i] dans le tableau et la transmet en tant que paramètre.
En utilisant des paramètres différents, les sous-routines erand48, jrand48et nrand48 permettent à des modules distincts d'un programme de grande taille de générer des séquences indépendantes de nombres pseudo-aléatoires. En d'autres termes, la séquence de nombres qu'un module génère ne dépend pas du nombre de fois où les sous-programmes sont appelés par d'autres modules.
La sous-routine lcong48 spécifie la valeur x[i] initiale, la valeur de multiplicateur aet la valeur d'ajout c. Les éléments de tableau Paramètre Paramètre[ 0-2 ] spécifient x[i], Paramètre[ 3-5 ] spécifient le multiplicateur aet Paramètre[ 6 ] spécifie le module complémentaire 16 bits c. Une fois que lcong48 a été appelé, un appel ultérieur à la sous-routine srand48 ou seed48 restaure la norme a et c spécifiée précédemment.
La sous-routine de l'initialiseur seed48 définit la valeur de x[i] sur la valeur de 48 bits spécifiée dans le tableau désigné par le paramètre Seed16v . En outre, seed48 renvoie un pointeur vers une mémoire tampon interne 48 bits qui contient la valeur précédente de x[i] utilisée uniquement par seed48. Le pointeur renvoyé vous permet de redémarrer la séquence pseudo-aléatoire à un point donné. Utilisez le pointeur pour copier la valeur x[i] précédente dans un tableau temporaire. Appelez ensuite seed48 avec un pointeur vers ce tableau pour reprendre le traitement là où la séquence d'origine s'est arrêtée.
La sous-routine d'initialiseur srand48 définit les 32 bits de poids fort de x[i] sur les 32 bits contenus dans son paramètre. Les 16 bits de poids faible de x[i] sont définis sur la valeur arbitraire 330E16.