CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[C] Probleme tableau aléatoire

Master_necrid2
Master_necrid2
Niveau 9
15 décembre 2009 à 18:35:11

Bonsoir, j'essaye de remplir un tableau à 2 dimensions (5x5) de nombres aléatoires différents, mais je n'y parviens pas... :(

Voici mon code: http://pastebin.com/m3f27f312

Bizarrement, j'obtiens des nombres aléatoires entre 1 et 25 (j'ai défini des constantes MAX et MIN), mais ces nombres ce répètent (par exemple le tableau est remplis de plusieurs 1, de plusieurs 17, ...) :(

Quelqu'un pourrait m'aider à trouver mon erreur?
Merci :)

godrik
godrik
Niveau 30
15 décembre 2009 à 18:46:13

je ne comprends pas ce que tu fais...
pourquoi ne pas faire
for (int i=0; i<5; i++) for (int j=0; j<5; j++) tab[i][j] = rand();
?

en passant, rand()%x c'est mal. Il faut preferer (int)((float)rand()/(float)RAND_MAX*x).
D'ailleurs on prefere drand48(3) ou random(3) a rand(3).

Master_necrid2
Master_necrid2
Niveau 9
15 décembre 2009 à 18:54:17

godrik :d) Merci de ta réponse rapide :p)

J'utilise des pointeurs car je travaille dans une fonction (j'ai donc passer l'adresse du premier élément du tableau par la variable *ptab), donc je ne peux pas utiliser tab[i][j] :)

Ensuite, concernant le rand()%, je suis malheureusement OBLIGE de l'utiliser même si c'est mal :(

IIIIIIIIIIIIIll
IIIIIIIIIIIIIll
Niveau 10
15 décembre 2009 à 18:58:50

Au fait, pourquoi c'est le mal ? :)

chris_27
chris_27
Niveau 10
15 décembre 2009 à 19:00:03

« (j'ai donc passer l'adresse du premier élément du tableau par la variable *ptab), donc je ne peux pas utiliser tab[i][j] » :d) merde, j'aurais pourtant juré qu'on pouvait le faire… mon TDman m'aurait menti ?! Ha oui, zut, c'est moi le TDman. :o))

chris_27
chris_27
Niveau 10
15 décembre 2009 à 19:03:10

Petit ajout pour te mettre sur la voie : tu déclares très mal ta fonction prenant en paramètre un tableau à deux dimensions. :oui:

Master_necrid2
Master_necrid2
Niveau 9
15 décembre 2009 à 19:16:06

"Très mal" :d) A ce point là! :ouch: :rire2:

Désolé je ne comprends pas très bien ou tu veux en venir :non2:
J'ai appris que pour alimenter un tableau dans une fonction, on avait besoin uniquement de l'adresse du premier élément (sauf si on utilise pas tous les éléments du tableau, mais ce n'est pas le cas ici) :doute:

Je me trompe ou je n'ai vraiment pas compris ton indice? :question:

Merci pour ton aide :)

Kaoron
Kaoron
Niveau 9
15 décembre 2009 à 19:41:40

Avec une fonction pareille, tu n'alimentes que des tableaux 5*5.
Pourquoi pas après tout, c'est un cas particulier de tableau à deux dimensions très intéressant.

Master_necrid2
Master_necrid2
Niveau 9
15 décembre 2009 à 19:44:27

Kaoron :d) C'est une consigne :ok:

godrik
godrik
Niveau 30
15 décembre 2009 à 19:50:19

C'est mal d'utiliser % car ca augmente les chances d'avoir des dependences cyclique. Sur un generateur "a la con", ca se voit bien. J'en parle ici : http://www.mandragor.org/article.php?id=12
C'est mal d'utiliser rand parceque la page de manuel le dit (sur beaucoup de systeme rand est implemente par un generateur lineaire congruentiel qui sont connu pour etre de mauvais generateur aleatoire).

Pour le probleme de base, je ne comprends pas bien pourquoi tu fais tout ca. Basiquement ce que tu veux afire c'est gerer des nombres et les mettre dans un tableau. Pourquoi tu as besoin de 5 boucles pour faire ca ?

Master_necrid2
Master_necrid2
Niveau 9
15 décembre 2009 à 20:00:00

Enfait, je dois remplir le tableau de nombre aléatoires DIFFERENTS (je ne peux pas avoir deux fois le même nombre) :(

Donc les deux premier 'for' permettent de parcourir le tableau pour y insérer les valeurs. Le do-while me permet de vérifier si le nombre généré aléatoirement est déjà présent dans le tableau: s'il l'est, je re-génère un nouveau nombre aléatoire et je vérifie s'il est déjà dans le tableau, et ainsi de suite, jusqu'à générer un nombre qui n'est pas encore présent.

Le problème, c'est qu'au final, j'obtiens quand même un tableau remplis de valeurs qui se répètent... :(

Note: je comprend que mon code est très très loin d'être bon (j'utilise rand%(), cette fonction ne s'appliquera qu'a un tableau de 5x5, etc,...) mais le problème n'est pas là: j'essaye de trouver pourquoi je n'arrive pas à avoir des nombres différents...

godrik
godrik
Niveau 30
15 décembre 2009 à 21:55:49

ah! j'ai compris.
En fait tu changes la valeur de ptab dans l'iteration de ta deuxieme boucle du coup ta verification ne pars pas du debut du tableau mais de la position courante.

NB: si ton tableau est contigu en memoire (ce qui a l'air d'etre le cas puisque tu te content d'increment ptab), tu peux generer 25 element plutot que 5*5; Ca va retirer des boucle et ameliorer la visibilite.

chris_27
chris_27
Niveau 10
15 décembre 2009 à 22:14:07

« C'est une consigne » :d) ça sent le flou artistique. Mais bon, du coup je suis moins surpris par l'étrangeté du code.

Si dans la déclaration de ta fonction tu mets "int *t", ça veut dire que tu lui passes une adresse, assimilable à un tableau à *une* dimension. Et du coup, si tu donnes un "int t[5][5]" à ta fonction, tout ce qu'elle verra c'est 25 cases de suite en mémoire (en oubliant que c'est 5 lignes de 5 cases chacunes). Du coup, comme l'a dit godrik, une seule boucle suffit :

for (i=0; i<25; i++)
t[i] = … ;

J'avais en tête la déclaration de fonction suivante :

void alimentation(short ptab[][5])

Sous forums
  • Aide à l'achat Mac
  • Création de Jeux
  • Linux
  • Création de sites web
  • Programmation
  • Internet
  • Steam Deck
  • Macintosh
  • Hardware
La vidéo du moment