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)
double erand48 ( xsubi)
unsigned short int xsubi[3];
long int jrand48 (xsubi)
unsigned short int xsubi[3];
void lcong48 ( Parameter)
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 *seed48 ( Seed16v)
unsigned short int Seed16v[3];
void srand48 ( SeedValue)
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 > = 0

Le 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 8

Paramè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.