2010-09-05 7 views
3

Je dois ensemencer le générateur de nombres aléatoires dans boost (qui est chargé depuis un int) pour quelques processus, pour un programme qui doit compiler et fonctionner à la fois sous Windows et sous Linux.Graines aléatoires à partir de millisecondes sous Windows et Linux

J'ai utilisé std:time(0), qui a fonctionné, mais comme les processus sont des tâches qui s'exécutent simultanément, certaines d'entre elles fonctionneraient à la même seconde, produisant les mêmes résultats.

J'ai donc besoin de le semer en millisecondes, ou tout autre générateur aléatoire multi-plateforme d'ailleurs. J'ai essayé clock() mais je ne pouvais pas le faire convertir de time_t en int.

Merci.

+0

Même avec une précision de l'ordre de la milliseconde, il est probable que 2 fils finissent avec la même graine. – Goz

+0

J'espère que ce n'est pas destiné à être sécurisé. –

+0

@Goz: Et Windows est généralement précis à quelque chose comme 32ms ... –

Répondre

0

Si vous démarrez tous les travaux à partir d'un seul script.

Ensuite, vous pouvez passer un nombre incrémenté comme argument sur la ligne de commande. Chaque Job ajoute ensuite cette valeur au résultat de time() pour générer sa graine.

Remarque: Je ne vois aucune exigence dans le PO concernant la sécurité.
Le code d'origine utilise le temps (NULL) et il aura une graine devinable.

int main(int argc,char* argv[]) 
{ 
    srand(time(NULL) + boost::lexical_cast<int>(argv[1])); 

    // STUFF 
} 
3

Il est probablement préférable d'utiliser une source de nombre aléatoire spécifique à la plate-forme. Sous Linux, utilisez /dev/urandom et lisez quelques octets. Sous Windows, un moyen simple d'acquérir quelques octets d'entropie est UuidCreate.

+0

L'équivalent Windows est d'utiliser le CSP, pas de générer un GUID. –

+0

True, mais si vous n'avez pas besoin de haute sécurité, la génération d'un UUID est plus simple que l'utilisation du CSP. Notez que Windows ne génère plus d'UUID séquentiels par défaut. –

+0

Je suis d'accord qu'un UUID est plus simple et qu'il est généré en utilisant un PRNG plutôt qu'une simple séquence. Cependant, il reste que la fonction CryptGenRandom du CSP est l'équivalent de urandom et qu'elle est plus sécurisée que celle des UUID. –

Questions connexes