Est-ce que srand (getpid ()) affecte le format / la structure?

Cette question est rapide :). Je sais que srand() est utilisé pour générer un générateur de nombres aléatoires afin d’éviter que la même séquence de nombres aléatoires soit générée. De même, je sais que getpid() “renverra l’identifiant du processus appelant.”

( http://pubs.opengroup.org/onlinepubs/009695399/functions/getpid.html )

Étant donné que l’ID de processus est finalement différent chaque fois que vous exécutez mon programme (un programme où un producteur et un consommateur communiquent sur une mémoire partagée), le PID sera également différent, ce qui donnera une graine parfaite. J’ai défini une plage pour les nombres aléatoires rand() % (100-1) + 1 .

Est-ce que srand(getpid()) fournit des nombres aléatoires dans un format spécifique?

Pour être complet, voici la section de code que ma demande concerne:

 srand(getpid()); while(x == 0) { if(*randNum == 101) { *randNum = rand() % (100 - 1) + 1; *pidNum = getpid(); printf("priority: %d Process ID: %d \n", *randNum, *pidNum); x = 1; } else { *randNum++; *pidNum++; } } 

Je ne suis pas sûr de ce que vous entendez par un format spécifique. Mais getpid () n’est pas un bon choix en tant que graine. Les PID se trouvent dans une plage assez petite de l’espace “unsigned” et sont sortingviaux à deviner.

Si vous ne vous souciez pas des personnes capables de deviner votre graine, le temps (NULL) est un choix bien meilleur en tant que graine.

Deux processus en cours d’exécution n’ont jamais le même PID, c’est certain, mais rien ne garantit qu’un nouveau processus ne reçoit pas le même PID qu’un processus qui vient de se terminer. Habituellement, le PID est constamment augmenté, mais il débordera tôt ou tard (par exemple, sous Linux, le PID maximal est de 32 768 par défaut), puis les PID déjà utilisés seront recyclés (certains systèmes recyclent aussi plus tôt que ils ont réservé des plages de PID pour différents types de processus, etc.).

Le prochain problème est que rand est un très mauvais générateur aléatoire sur de nombreux systèmes (Linux peut être une exception, mais vos tags disent “UNIX”). BSD indique même cette littérature sur la page de manuel (vrai pour la plupart des descendants de BSD, y compris même MacOS X). Il n’y est que pour la compatibilité avec du code non-POSIX. Tout le code moderne utilise plutôt le random . C’est un meilleur générateur de nombres aléatoires sur la plupart des systèmes (et sur les autres systèmes, ce n’est pas pire que rand() , donc vous n’avez rien à perdre en l’utilisant). À moins que vous ne puissiez toujours être sûr que votre code ne fonctionnera jamais sur aucun système avec une implémentation ” rand() faible”, l’utilisation random est l’approche la plus sûre.

La plupart des systèmes supportent un appel srandomdev() , qui ne fait pas partie de la norme POSIX, mais il est presque disponible sur tous les systèmes de nos jours. Ceci initialise au random en lisant les données d’un générateur aléatoire dans le kernel du système (sur de nombreux systèmes disponibles via /dev/random ). Ce générateur de nombres aléatoires génère de très bons nombres aléatoires et, selon le matériel du système, il peut même générer des “vrais nombres aléatoires”. Par exemple, de nombreux processeurs modernes et certaines puces de la carte mère disposent de générateurs de nombres aléatoires matériels capables de générer des nombres aléatoires avec un “bruit élecsortingque aléatoire” presque parfaitement aléatoire. Si un tel matériel est disponible et compatible, il utilisera pour générer les nombres aléatoires.