Comment générer de très grand nombres aléatoires? [Résolu]

Signaler
Messages postés
6
Date d'inscription
lundi 30 août 2004
Statut
Membre
Dernière intervention
27 avril 2006
-
Messages postés
6
Date d'inscription
lundi 30 août 2004
Statut
Membre
Dernière intervention
27 avril 2006
-
Bonjour!

J'ai un petit problème pour générer de grands nombres de manière aléatoire. J'utilise une portion d'un code-source posté sur ce site, mais les résultats sont inattendus, soit j'obtiens des nombres négatifs, soit j'obtiens (en bidouillant un peu sur les types de données et les signes) des nombres 10 000 fois trop grands .

J'aurai besoin de générer des nombres compris entre deux bornes (minimal, et maximal), mais il y a plusieurs centaines de milliers entre les deux bornes ; par exemple entre 0 et 6 556 016 en début de programme puis l'écart s'élargit au fur et à mesure que le programme tourne (je créé un programme de modélisation d'une population importante - les turcs! - et je dois bientot rendre mon projet).

J'avais penser générant plusieurs fois des nombres aléatoires sur des bornes moins espacés (additionner les 6 556 016 nombres aléatoire générés avec comme bornes 0 et 1), mais cela ne devient plus un nombre aléatoire mais une moyenne à cause de la Loi des grands nombres.

Pourrait-on m'aider, s'il-vous-plait ?...
merci

9 réponses

Messages postés
232
Date d'inscription
vendredi 9 janvier 2004
Statut
Membre
Dernière intervention
8 janvier 2005

salut,

pour les nombres aléatoires, double(rand()) / RAND_MAX produit un nombre aléatoire entre 0 et 1. Apres tu multiplies, tu ajoutes pour cadrer la plage de nombre voulue.
int srand(int) pour initaliser.
Pour aller plus loin, voir la librairie boost qui propose de bons générateurs aléatoires.
Messages postés
627
Date d'inscription
mercredi 16 juin 2004
Statut
Membre
Dernière intervention
24 juillet 2011

Euh, moi j'ai une tite solution, une fonction que j'ai crée moi même et que j'utilise quand j'ai besoin de nombres aléatoire quelconque...
la voici :


DWORD GetRandomValue(DWORD dwMaxValue) {

  if ((dwMaxValue % GetTickCount()) == 0)
   return dwMaxValue;

  return GetRandomValue(dwMaxValue - 1);
}



Gendal67, Dev-C++ 4.9.9.1, J'adore cppfrance!! :-))
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
'nombres aléatoire quelconque'
oui quelconque, c'est justement le but, je me demande ce que seraient des nombres aléatoires non quelconques

2^32, ce n'est pas un très grand nombre ca...
Messages postés
627
Date d'inscription
mercredi 16 juin 2004
Statut
Membre
Dernière intervention
24 juillet 2011

vecchio> c'est 2^32 - 1 je crois plutot...et d'après la plage de nombres qu'il a donné en haut (regarde bien) : 0 à 6 556 016, ça colle sans probleme (un DWORD pouvant stocker des valeurs allant de 0 à 4 294 967 295)...

plus_plus_fab> bonne idée.....mais quelle est la précision retournée par rand() ? Parce que multiplier par un nombre la valeur retournée, c'est ingénieux si la précision est bonne, sinon cela ôte des possibilités...

ex :

rand() retourne 1.25 et double() multiplie par 1000, ça donne 1250 ... et là, comme la précision est mauvaise, la perte est importante car tu ne peux obtenir 1251, 1252, 1253, 1524, 1255, etc...

Gendal67, Dev-C++ 4.9.9.1, J'adore cppfrance!! :-))
Messages postés
627
Date d'inscription
mercredi 16 juin 2004
Statut
Membre
Dernière intervention
24 juillet 2011

vecchio> ''nombres aléatoire quelconque << oui, lol, désolé, j'ai ecore dit uen connerie ^^.... on va dire que "quelconque" signifie, "dans une plage donnée" ^^

Gendal67, Dev-C++ 4.9.9.1, J'adore cppfrance!! :-))
Messages postés
232
Date d'inscription
vendredi 9 janvier 2004
Statut
Membre
Dernière intervention
8 janvier 2005

rand();retourne un int entre 0 et RAND_MAX (défini par l'implémentation)
ensuite on caste avec le type double, puis la division par RAND_MAX produit aussi un double. Donc au final, on a un double.
La précision d'un double est connu, et a jesaispluscombien de chiffres significatifs, donc il ne faut pas aller au de la de la précision d'un double.
Il y a long double, qui est un peu plus grand au cas ou ...
Messages postés
6
Date d'inscription
lundi 30 août 2004
Statut
Membre
Dernière intervention
27 avril 2006

merci déjà pour ces réponses.

Je voulais juste savoir avant de modifier l'ensemble de mon programme (qui fait quand même 1000 lignes sans compter les commentaire!), si la première solution postée par Gendal67 n'est pas un peu risquée?

Je sais que je ne connais pas grand chose à la programmation car je débute, (si j'ai pigé de travers, alors dsl!), mais est-ce que cela ne risque pas de surcharger la mémoire? Car il semble que ce soit une fonction récursive (encore dsl si je me plante!) et si je veux générer un nombre en 0 et 6 556 016 combien de fois sera appelée la fonction GetRandomValue(DWORD dwMaxValue)?

si je me trompe merci de me le dire et alors j'appliquerai cette solution.
Messages postés
627
Date d'inscription
mercredi 16 juin 2004
Statut
Membre
Dernière intervention
24 juillet 2011

Euh si, exactement en fait! ça risque de tourner un bon moment ^^ prend la méthode de plus_plus_fab ;) bonne journée

Gendal67, Dev-C++ 4.9.9.1, J'adore cppfrance!! :-))
Messages postés
6
Date d'inscription
lundi 30 août 2004
Statut
Membre
Dernière intervention
27 avril 2006

Et bien tout marche impécable (la perte de données n'est pas importante dans mon cas) !

Merci pour tout!