C/C++ probleme avec rand

Fermé
barbe63 Messages postés 7 Date d'inscription lundi 15 septembre 2014 Statut Membre Dernière intervention 29 septembre 2014 - Modifié par Whismeril le 15/09/2014 à 06:36
barbe63 Messages postés 7 Date d'inscription lundi 15 septembre 2014 Statut Membre Dernière intervention 29 septembre 2014 - 15 sept. 2014 à 14:25
Bonjour,

j'ai un gros souci, si je veux faire un random sur un nombre assez grand (dans les 323000 dans mon exemple) j'obtiens toujours des résultats dans la même tranche (ne dépasse jamais les 32000) ce qui est plutôt embêtant vu mon tp.
Pour l'histoire je suis sur un tp de pendu et j'ai ajouté un fichier dictionnaire en txt avec donc plus de 323000 entrées mais je n'ai que des mots qui commencent par A ou B dans tout mes tests.
J'ai lu quelque part que la fonction rand était un peu mal foutue et ne donnait qu'une piètre randomisation. mais je n'ai pas lu la réponse concrète a cette question...n'y a t-il aucun moyen pour palier à ça?

J'ai essayé de multiplier les rand pour voir, cela semblait marcher pour d'autre mais pour moi sans succès. le bout de mon code:

long nombreAleatoire(long nombreMax)
{
    srand(time(NULL));
    long a,b,c;
    a=(rand() % nombreMax);
    b=(rand() % nombreMax);
    c=(rand() % nombreMax);
    printf ("%ld %ld %ld\n %ld\n",a,b,c,nombreMax);
    return (rand() % nombreMax);
}


Donc pour explication mon a, b et c ne sont la que pour du test et du deboguage, je ne me sers que du return par la suite.
Il m'affiche bien mon nombreMax à 323577, le a ne varie jamais beaucoup (dans les 23000 ), le b et le c sont plus aléatoires mais jamais plus haut que 32000.


Serait il possible qu'en plus d'avoir un problème a tirer un nombre aléatoire du premier coup (a n'est pas vraiment aléatoire alors que b et c le sont plus)il ne fasse pas plus haut qu'un int en résultat (malgré que j'ai préciser mon type en long)?

Merci de vos réponses.


A voir également:

2 réponses

barbe63 Messages postés 7 Date d'inscription lundi 15 septembre 2014 Statut Membre Dernière intervention 29 septembre 2014 4
15 sept. 2014 à 14:25
J'ai cherché plus en avant sur la piste de la limite en int et il semblerait que j'ai vu juste.

int main()
{
    int i;
    long nombreMax=500000;
    srand(time(NULL));
    for (i=0;i<100;i++)
    {
       printf(" %ld",(rand() % nombreMax));
    }
    return 0;
}


Cela me renvoie 100 nombre, le premier étant toujours dans les mêmes eaux, variant d'une dizaine entre chaque test et les autres aléatoires mais en dessous de 32 767.

J'ai par la suite modifié ce code pour le faire tourner 1000 fois et retenir le maximum tiré pour voir et la encore la limite s'approche très sensiblement du int.

Comment puis je faire pour augmenter cette limite alors? Et y a t'il un autre moyen que de faire un coup dans le vide pour faire un meilleur random?
1
Whismeril Messages postés 19026 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024 931
15 sept. 2014 à 06:36
Bonjour, message modifié par l'ajout des balises de code.
Voir ici comment bien utiliser la coloration syntaxique.
0