Comment générer de très grand nombres aléatoires?

Résolu
cs_Erebus Messages postés 6 Date d'inscription lundi 30 août 2004 Statut Membre Dernière intervention 27 avril 2006 - 30 déc. 2004 à 19:01
cs_Erebus Messages postés 6 Date d'inscription lundi 30 août 2004 Statut Membre Dernière intervention 27 avril 2006 - 31 déc. 2004 à 12:07
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
A voir également:

9 réponses

plus_plus_fab Messages postés 232 Date d'inscription vendredi 9 janvier 2004 Statut Membre Dernière intervention 8 janvier 2005
30 déc. 2004 à 20:28
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.
3
Gendal67 Messages postés 627 Date d'inscription mercredi 16 juin 2004 Statut Membre Dernière intervention 24 juillet 2011 2
30 déc. 2004 à 19:54
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!! :-))
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
30 déc. 2004 à 20:08
'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...
0
Gendal67 Messages postés 627 Date d'inscription mercredi 16 juin 2004 Statut Membre Dernière intervention 24 juillet 2011 2
30 déc. 2004 à 20:36
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!! :-))
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Gendal67 Messages postés 627 Date d'inscription mercredi 16 juin 2004 Statut Membre Dernière intervention 24 juillet 2011 2
30 déc. 2004 à 20:39
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!! :-))
0
plus_plus_fab Messages postés 232 Date d'inscription vendredi 9 janvier 2004 Statut Membre Dernière intervention 8 janvier 2005
30 déc. 2004 à 22:16
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 ...
0
cs_Erebus Messages postés 6 Date d'inscription lundi 30 août 2004 Statut Membre Dernière intervention 27 avril 2006
31 déc. 2004 à 10:59
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.
0
Gendal67 Messages postés 627 Date d'inscription mercredi 16 juin 2004 Statut Membre Dernière intervention 24 juillet 2011 2
31 déc. 2004 à 11:49
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!! :-))
0
cs_Erebus Messages postés 6 Date d'inscription lundi 30 août 2004 Statut Membre Dernière intervention 27 avril 2006
31 déc. 2004 à 12:07
Et bien tout marche impécable (la perte de données n'est pas importante dans mon cas) !

Merci pour tout!
0
Rejoignez-nous