Flux rss
Collection CommentCaMarche.net

Générer des nombres aléatoires efficacement avec rand()

Publié par kilian, dernière mise à jour le jeudi 17 juillet 2008 à 21:34:48 par sebsauvage

Générer des nombres aléatoires efficacement avec rand()


Vous avez peut-être remarqué qu'en C, en utilisant la fonction rand() de la bibliothèque standard, vous obtenez des résultats décevants, trop souvent les mêmes.

Prenons un exemple, vous voulez générer 5 nombres aléatoires d'affilée:

#include <stdlib.h>
#include <stdio.h>

int main()
{
    int i;
    for(i=0; i<5; i++)
    {
        printf("%d\n", rand());
    }
    return 0;
}


Exécutons ce programme et regardons ce qu'il nous écrit:
41
18467
6334
26500
19169


C'est bien, ce sont des résultats sensiblement différents. Mais si vous relancez votre programme, vous aurez la même série de nombres.

Pour modifier le comportement du générateur de nombres aléatoires, on peut modifier une variable sur laquelle il se base pour ses calculs. On appelle ça une graine (ou seed).
Cette graine se modifie avec la fonction srand():
srand(valeur de la graine)

Il faut un nombre que l'on ne peut pas prévoir facilement et qui varie toujours d'un instant à l'autre.
Par exemple, vous pouvez prendre le nombre de cycles utilisés par votre processeur depuis le démarrage.
Il peut être obtenu, sur les processeurs x86 (intel, Amd etc...), avec la commande assembleur rdtsc.
L'écriture d'une fonction rdtsc() appelant cette commande en assembleur pourra vous faciliter la vie, la syntaxe suivante fonctionne avec gcc sous Linux, que vous pouvez retrouver d'ailleurs avec dev C++ sous Windows.

#include <stdlib.h>
#include <stdio.h>

int rdtsc()
{
    __asm__ __volatile__("rdtsc");
}

int main()
{
    int i;
    for(i=0; i<5; i++)
    {
        srand(rdtsc());
        printf("%d\n", rand());
    }
    return 0;
}


Avec ce code, vous aurez déjà des nombres aléatoires plus efficaces.

Attention, cette solution ne fonctionne que sur les processeurs x86. Si votre programme doit être portable sur d'autres architectures de processeurs, il faudra envisager autre chose.

Evitez également d'activer des optimisations dans le compilateur (option -O1, -O2, -O3 etc...) ; si vous utilisez cette fonction rdtsc, vous risquez d'avoir un comportement étrange....

Résultats pour Générer des nombres aléatoires efficacement avec rand()

Langage C - nombre aleatoire (Résolu) Bonjour, Je voudrais reproduire en C un lancé de dé. Il me faut donc créer un nombre aléatoire en 1 et 6. J'ai utiliser la fonction rand() mais sans succès, le résultat est toujours 41 :S J'ai chercher sur des sites de programmation mais... www.commentcamarche.net/forum/affich-5573865-langage-c-nombre-aleatoire
Generateur de nombre aléatoire (Résolu) Bonjour, je cherche à faire un générateur de nombre aléatoire, entre [1;4] le code ci dessous, me genere toujours la meme suite de nombre. (il s'agit du langage C) void tirerSymbole(int e) { // srand(time(NULL)); { e = 1 + (int)((double)rand() /... www.commentcamarche.net/forum/affich-4177585-generateur-de-nombre-aleatoire
Nombre aléatoires en c (Résolu) Bonjour, comment peut-on générer des nombres aleatoires en c. j'ai utilisé ran(99) pour générer des nombres entre 0 et 98 et le compilateur me sort un error"extra parameter " www.commentcamarche.net/forum/affich-6243433-nombre-aleatoires-en-c

Résultats pour Générer des nombres aléatoires efficacement avec rand()

Fichiers sqmdata**.sqm et sqmnoopt**.sqmLes fichiers sqmdata**.sqm et sqmnoopt**.sqm Vous avez peut-être remarqué un nombre important de fichiers au format SQM sur votre disque dur. Ceux-ci sont sous la forme sqmdata**.sqm ou sqmnoopt**.sqm (** sont deux chiffres aléatoires) A la... www.commentcamarche.net/faq/sujet-8488-fichiers-sqmdata-sqm-et-sqmnoopt-sqm
[VBA] Fonction NB.SI_PlusFonction NB.SI_Plus sans limitation Cette fonction "Plus" permet d'appliquer la fonction NB.SI sans que l'on soit limité au nombre de paramètres imposés par Excel. Introduction Le classeur Dans un module général Télécharger le... www.commentcamarche.net/faq/sujet-12864-vba-fonction-nb-si-plus
Sécuriser sa DebianSécuriser sa distribution Debian Voici un document, très intéressant pour mettre en place une sécurité efficace sur un système Debian. Assez conséquent (+ de 150 pages), le document aborde bon nombre de sujets, du chargement du bootloader jusqu'à... www.commentcamarche.net/faq/sujet-8606-securiser-sa-debian

Résultats pour Générer des nombres aléatoires efficacement avec rand()

Nombre aléatoire (Résolu)Bonjour, savez-vous coment obtenir des nombres aléatoires avec Dev-c++? random et randomize ne fonctionnent plus. www.commentcamarche.net/forum/affich-7606552-nombre-aleatoire
Aide nombre aleatoire ous excell (Résolu)Bonjour J'aimerais creer des nombres aleatoires avec ALEA (sans utiliser de macro) mais le probleme c'est qu'à chaque fois que je rajoute une données dans la page, ces nombres aleatoires se renouvelle. Comment faire pour demander à... www.commentcamarche.net/forum/affich-3387345-aide-nombre-aleatoire-ous-excell

Résultats pour Générer des nombres aléatoires efficacement avec rand()

Télécharger PHP EditPHPEdit est un environnement de développement intégré (IDE) sous Windows pour le langage PHP. Il offre un grand nombre de fonctionnalités permettant de développer plus efficacement : Coloration syntaxique Auto-complétion des... www.commentcamarche.net/telecharger/telecharger-62-php-edit
Télécharger KerioKerio est un pare-feu très pratique et convivial, aux nombreuses fonctions, élément efficace dans la protection de votre ordinateur, permettant notamment : Le contrôle des paquets entrants et sortants par programme : 3 possibilités pour chaque... www.commentcamarche.net/telecharger/telecharger-206-kerio
Télécharger F-Secure BlackLightCe logiciel simple d'utilisation sera très efficace pour mettre en évidence et combattre les rootkits et toutes sortes de malwares invisibles aux yeux de bon nombre d'utilisateurs . www.commentcamarche.net/telecharger/telecharger-34055027-f-secure-blacklight

Résultats pour Générer des nombres aléatoires efficacement avec rand()

Denon DN-C100C 100,Couleur:Black,Divers:192kHz/24-Bit,Burr Brown D/A-converter,Random- and Repeat,IR-remote inclusive,Lecture aléatoire: ,Nombre de CD:1 CD,Sortie Numérique:Optique,Sortie casque,Text display: ,compatibilité MP3:  www.commentcamarche.net/guide-achat/denon-dn-c100-865713-fiche-technique
Pioneer CDJ-1000 Mk3Mk 3,Couleur: ,Divers: ,Lecture aléatoire: ,Nombre de CD:1 CD,Sortie Numérique:Optique,Sortie casque: ,Text display: ,compatibilité MP3 www.commentcamarche.net/guide-achat/pioneer-cdj-1000-mk3-612941-fiche-technique
Sony HDR-SR12SR 12,Zoom optique 12x,Zoom numérique 24x,570 grammes,3.2 pouces LCD,Stéréo,Dimensions de l'écran:3.2 pouces,Résolution de l'écran:922000 pixels,Type d'Ecran:LCD,Fonction photo,Nombre efficace de pixels:3.81 Mégapixels,Résolution photo:3680x2760... www.commentcamarche.net/guide-achat/sony-hdr-sr12-1059203-fiche-technique

Résultats pour Générer des nombres aléatoires efficacement avec rand()

Oracle - Les processusLes processus Le fonctionnement de la base Oracle est régi par un certain nombre de processus chargés en mémoire permettant d'assurer la gestion de la base de données. On distingue généralement deux types de processus : les processus utilisateurs... www.commentcamarche.net/contents/oracle/oracproc.php3
La mémoire vive (RAM ou mémoire PC)Types de mémoires vives On distingue généralement deux grandes catégories de mémoires vives : Les mémoires dynamiques (DRAM, Dynamic Random Access Module), peu coûteuses. Elles sont principalement utilisées pour la mémoire centrale de l'ordinateur... www.commentcamarche.net/contents/pc/ram.php3
Les structures en langage CDifférence entre une structure et un tableau Un tableau permet de regrouper des éléments de même type, c'est-à-dire codés sur le même nombre de bits et de la même façon. Toutefois, il est généralement utile de pouvoir rassembler des éléments de... www.commentcamarche.net/contents/c/cstruct.php3