Random

Fermé
biba - 15 mars 2010 à 17:19
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 16 mars 2010 à 20:11
Bonsoir,
en incluant la fonction random pour la récupération des nombres aléatoires, j'obtiendrais le message suivant:
undefined reference to `Rand'
Voilà mon bout du code:

int main(int argc,char** argv)
{float * a,*b;
int size,i,j;
srand(time(NULL)); //initialise le generateur de nbre aleatoire

size=atoi(argv[1]);

a=(float*)malloc(size*sizeof(float));
b=(float*)malloc(size*sizeof(float));


for(i=0;i<size;i++)
for(j=0;j<size;j++)
a[i*size+j]=(Rand() % 10) + 1;//nombre entre 0 et 10

for(i=0;i<size;i++)
b[i]=(Rand() % 10) + 1;


Solve( a, b, size);
return (0);
}

Merci d'avance.

2 réponses

mohammed3011 Messages postés 23 Date d'inscription mardi 5 août 2008 Statut Membre Dernière intervention 18 février 2011
16 mars 2010 à 12:06
est ce que ta ajouté la bibliothèque qui contient la fonction RAND() au header?
si je me rappelle bien time.h(pas sur ^_^).
0
Bonsoir,
merci pour votre réponse, bien sur j'ai ajouté la bib au header mais c pas ça était le pb.En effet, j'ai résolu le pb en mettant:
j=1+(int) (10.0*rand()/(RAND_MAX+1.0));en s'appuyant sur le poid fort au lieu de:
j=1+(rand() % 10);

merci
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
16 mars 2010 à 20:11
Bonsoir,

Le problème était tout simple.
Le compilateur dit : "undefined reference to `Rand'".
Effectivement la fonction n'est pas Rand() mais rand() en minuscule. Le compilateur respecte la casse.
La version j=1+(rand() % 10) fonctionnera donc correctement (avec, bien sûr, rand() en minuscule).
Mais pour respecter l'équiprobabilité, il vaut mieux s'appuyer sur les poids forts comme tu l'as si bien dit.

Ensuite, il y a un problème dans ces lignes :
a=(float*)malloc(size*sizeof(float));
for(i=0;i<size;i++)
for(j=0;j<size;j++)
a[i*size+j]=...;//nombre entre 0 et 10

i*size+j est la plupart du temps plus grand que size. Donc, il y aura un bufferoverflow pour i>=1 compte tenu de la taille du tableau.
De plus, j'ajoute quelque précision sur le code.
Tu devrais vérifier que size est supérieur à 0 sinon malloc va échouer.
N'oublie pas de vérifier la valeur de retour des malloc.
N'oublie pas de libérer les ressources allouées avec free.
Le cast devant malloc est inutile, puisqu'il y a cast implicite.
Dans la plupart des cas, tu devrais mieux utiliser double que float.

return (0);
Il n'y a pas besoin de parenthèse, return n'est pas une fonction. Un simple return 0; suffit.

Cdlt,
0