IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Turbo Pascal Discussion :

[TP] Matrice générée aléatoirement


Sujet :

Turbo Pascal

  1. #1
    Membre régulier Avatar de magicstar
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations forums :
    Inscription : Mars 2007
    Messages : 136
    Points : 84
    Points
    84
    Par défaut [TP] Matrice générée aléatoirement
    Bonjour;
    je doit créer une matrice(3par3) qui contient des nombres réels générés aléatoirement;de tel sorte que la somme des éléments de chaque ligne (résp colonne) est égale à 1.
    PLEASE
    THANK'S A LOT

  2. #2
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 950
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 950
    Points : 5 667
    Points
    5 667
    Par défaut
    Hi,
    Citation Envoyé par magicstar
    Bonjour;
    je doit créer une matrice(3par3) qui contient des nombres réels générés aléatoirement;de tel sorte que la somme des éléments de chaque ligne (résp colonne) est égale à 1.
    PLEASE
    THANK'S A LOT
    Pout moi, ton énoncé contient une erreur conceptuelle qui le rend insoluble tel quel.

    Car l'exigence sur la somme des valeurs sur les lignes et colonnes est absolument incompatible avec "des nombres réels générés aléatoirement".

    Si on veut le faire effectivement avec des valeurs aléatoires, alors le temps de trouver une solution, et l'Univers aura sérieusement vieilli.

  3. #3
    Membre actif Avatar de Ultima
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2006
    Messages : 223
    Points : 261
    Points
    261
    Par défaut
    Bonsoir,
    Pour moi ça a l’aire réalisable,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Traitons la première ligne :
        Pour la première case, c1 := random(101) ;
        Pour la deuxième case, si c1 est différent de 100 alors c2 := random(101-c1) ;
            sinon c2 := 0
        pour la troisième case si c1+c2 différent 100 alors c3 := 100-(c1+c2) ;
            sinon c3 := 0 ;
    Traitons la deuxième ligne :
        première case : si c1 est différent de 100 alors c4 := random(101-c1)
            sinon c4 := 0
        ...
        ...
    ainsi de suite pour les autres cases.
    Remarque: Sur mon algo la somme des cases doit donner 100.

  4. #4
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 950
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 950
    Points : 5 667
    Points
    5 667
    Par défaut
    Ho,
    Citation Envoyé par Ultima
    Bonsoir,
    Pour moi ça a l’aire réalisable,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Traitons la première ligne :
        Pour la première case, c1 := random(101) ;
        Pour la deuxième case, si c1 est différent de 100 alors c2 := random(101-c1) ;
            sinon c2 := 0
        pour la troisième case si c1+c2 différent 100 alors c3 := 101-(c1+c2) ;
            sinon c3 := 0 ;
    Traitons la deuxième ligne :
        première case : si c1 est différent de 100 alors c4 := random(101-c1)
            sinon c4 := 0
        ...
        ...
    ainsi de suite pour les autres cases.
    Remarque: Sur mon algo la somme des cases doit donner 100.
    Oui, en le prenant comme ça, ça peut aller, mais ce n'est pas aussi simple que ce que tu fais, il faut également tenir compte des sommes dans les colonnes. Si on prend ton principe de ne tirer que quelques valeurs au hasard, c'est quand même soluble, sans trop de difficulté.

    Par contre, dans l'énoncé, je lis "qui contient des nombres réels générés aléatoirement", pas "dont une partie sont des nombres réels générés aléatoirement".

    Problème supplémentaire, il y est question de réels, pas d'entiers. Gare aux problèmes de tests et erreurs de calculs avec les réels.

  5. #5
    Membre actif Avatar de Ultima
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2006
    Messages : 223
    Points : 261
    Points
    261
    Par défaut
    Bonsoir,
    Citation Envoyé par droggo
    Par contre, je lis "qui contient des nombres réels générés aléatoirement", pas "dont une partie sont des nombres réels générés aléatoirement".

    Et aussi, il y est question de réels, pas d'entiers. Gare aux problèmes de tests et erreurs de calculs avec les réels.
    Un nombre généré à partir d’un nombre généré aléatoirement est lui-même aléatoire.
    c1 := random(x),
    c2 := f(c1) implique que c2 est lui-même aléatoire, non ?

    n/100 est un nombre du type REAL.
    J’ai fait mon exemple avec 100, alors il suffit de diviser par 100.

  6. #6
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 950
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 950
    Points : 5 667
    Points
    5 667
    Par défaut
    Ho,
    Citation Envoyé par Ultima
    Un nombre généré à partir d’un nombre généré aléatoirement est lui-même aléatoire.
    c1 := random(x),
    c2 := f(c1) implique que c2 est lui-même aléatoire, non ?
    Ca dépend de la fonction.

    Dans ta méthode, ce sont des if..., et tu forces des valeurs : ce n'est pas aléatoire.

    En fait, dans ta méthode, seul le 1er nombre tiré peut être vraiment aléatoire, dès le second, il y a une condition à respecter : ce n'est plus aléatoire.

    Citation Envoyé par Ultima
    n/100 est un nombre du type REAL.
    J’ai fait mon exemple avec 100, alors il suffit de diviser par 100.
    Le problème avec les réels, c'est la repésentation par la machine, qui fait que seule une toute petite partie des valeurs possibles dans l'étendue offerte par les types les gérant a une représentation exacte (par exemple, 0.1 n'est pas représenté exactement, car il n'y a pas de représentation binaire permettant de le faire).

    De ce fait, les tests de comparaison échoue souvent, parce que une même valeur numériquement unique, (c'est à dire avec un calcul "manuel") sera probablement représentée par l'ordinateur de 2 manières différentes si les calculs y menant sont différents.

    Il faut prendre beaucoup de précautions pour calculer avec des réels.

    Reprenons avec ta méthode : il faut être concient qu'elle va conduire très souvent à une impasse, qui se révélera généralement en vérifiant la valeur pour la dernière case, qui nécessitera 2 valeurs différentes pour rendre la ligne ou la colonne valides, mais parfois aussi avant.

    Au-delà de ça, je suis étonné par l'énoncé, car ce genre de "carré magique" se remplit généralement avec des entiers (strictement positifs).

  7. #7
    Membre régulier Avatar de magicstar
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations forums :
    Inscription : Mars 2007
    Messages : 136
    Points : 84
    Points
    84
    Par défaut matrice générée aléatoirement
    Bonsoir,
    est ce qu'un code comme celui-ci peut marcher??( pour une matrice de 3*3)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    program matrice;
    uses wincrt;
    var
    m:array[1..3,1..3]of real;
    x,y,x1,y1,x2,y2:real;
    i,j:integer;
    c:boolean;
    begin
    m[1][1]:=random;
    repeat
    m[2][1]:=random;
    x:=m[1][1]+m[2][1];
    until x<1;
    m[3][1]:=1-x;
    repeat
    m[1][2]:=random;
    y:=m[1][1]+m[1][2];
    until y<1;
    m[1][3]:=1-y;
    repeat
    m[2][2]:=random;
    x1:=m[2][2]+m[1][2];
    y1:=m[2][2]+m[2][1];
    if x1<1 then
    if y1<1then
    c:=true
    else
    c:=false;
    until c;
    m[3][2]:=1-x1;
    m[2][3]:=1-y1;
    x2:=m[1][3]+m[2][3];
    y2:=m[3][1]+m[3][2];
    if y2<1 then
    if x2<1 then
    c:=true
    else
    c:=false;
    repeat
    m[3][3]:=random;
    until c;
    for i:=1 to 3 do
    for j:=1 to 3 do
    writeln(m[i][j]);
    end.
    MERCIIIIII

  8. #8
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 950
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 950
    Points : 5 667
    Points
    5 667
    Par défaut
    Ho,

    Citation Envoyé par magicstar
    Bonsoir,
    est ce qu'un code comme celui-ci peut marcher??( pour une matrice de 3*3)

    MERCIIIIII
    Je n'ai pas de compilateur sous la main, mais je verrai plus tard.

    Conseil classique : indente et aère ton code (quelques sauts de ligne de-ci de-là améliorent nettement la lisibilité du code).
    Par exemple (car c'est un peu au goût de chacun )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
     
    program matrice;
    uses wincrt;
     
    var
        m:array[1..3,1..3]of real;
        x,y,x1,y1,x2,y2:real;
        i,j:integer;
        c:boolean;
    begin
        { ne pas oublier, sinon random renvoie toujours la même série de nombres }
        randomize; 
     
        m[1][1]:=random;
        repeat
            m[2][1]:=random;
            x:=m[1][1]+m[2][1];
        until x<1;
     
        m[3][1]:=1-x;
        repeat
            m[1][2]:=random;
            y:=m[1][1]+m[1][2];
        until y<1;
     
        m[1][3]:=1-y;
        repeat
            m[2][2]:=random;
            x1:=m[2][2]+m[1][2];
            y1:=m[2][2]+m[2][1];
            if x1<1
            then
                if y1<1
                then c:=true
                else c:=false;
        until c;
     
        m[3][2]:=1-x1;
        m[2][3]:=1-y1;
        x2:=m[1][3]+m[2][3];
        y2:=m[3][1]+m[3][2];
     
        if y2<1
        then
            if x2<1
            then c:=true
            else c:=false;
     
        repeat
            m[3][3]:=random;
        until c;
     
        for i:=1 to 3 do
            for j:=1 to 3 do
                writeln(m[i][j]);
     
        readln; { pour avoir le temps de lire l'affichage final }
    end.
    J'ai ajouté l'appel de randomize pour initialiser le générateur aléatoire.

    L'indentation met en évidence, dans la dernière partie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        if y2<1
        then
            if x2<1
            then c:=true
            else c:=false;
     
        repeat
            m[3][3]:=random;
        until c;
    a priori, ça va coincer : soit la boucle est infinie si c = false, soit on n'y passe qu'une fois si c = true, et ça ne renverra probablement pas une valeur valide.

    Edité

    Après réflexion, cette partie qui pose problème est inutile (tout ce que j'ai cité ci-dessus), puisque les autres cases remplies, m[3][3] est fixée, et sera
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        m[3][3] := 1 - m[1][3] - m[2][3];
    Avec cette correction, ça devrait marcher, sauf problème dû aux approximations des réels.

    Apparamment, j'avais vu des difficultés là où il y en a peu, ou pas. C'est mon esprit "tordu", en quelque sorte

  9. #9
    Membre régulier Avatar de magicstar
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations forums :
    Inscription : Mars 2007
    Messages : 136
    Points : 84
    Points
    84
    Par défaut Hooooo
    Bonjour droggo!
    Merci pour les améliorations que t'as apporté à mon programme, tu as raison il devient plus claire et lisible
    une autre question concernant ton code;tu as écrit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m[3][3]:=1-m[1][3]-m[2][3]
    pourquoi pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m[3][3]:=1-m[3][1]-m[3][2]

  10. #10
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 950
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 950
    Points : 5 667
    Points
    5 667
    Par défaut
    Hoï,
    Citation Envoyé par magicstar
    Bonjour droggo!
    Merci pour les améliorations que t'as apporté à mon programme, tu as raison il devient plus claire et lisible
    une autre question concernant ton code;tu as écrit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m[3][3]:=1-m[1][3]-m[2][3]
    pourquoi pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m[3][3]:=1-m[3][1]-m[3][2]
    C'est au choix, l'un ou l'autre. J'ai testé, ça donne bien la bonne valeur, donc ça marche.

    J'ai légèrement modifié la fin, pour pouvoir contrôler:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    program matrice;
    uses wincrt;
     
    var
        m:array[1..3,1..3]of real;
        x,y,x1,y1,x2,y2:real;
        i,j:integer;
        c:boolean;
        nt: longint;
    begin
        randomize;
        nt:=0;
     
        m[1][1]:=random;
        repeat
            m[2][1]:=random;
            x:=m[1][1]+m[2][1];
            inc(nt);
        until x<1;
     
        m[3][1]:=1-x;
        repeat
            m[1][2]:=random;
            y:=m[1][1]+m[1][2];
            inc(nt);
        until y<1;
     
        m[1][3]:=1-y;
        repeat
            m[2][2]:=random;
            x1:=m[2][2]+m[1][2];
            y1:=m[2][2]+m[2][1];
            if x1<1
            then
                if y1<1
                then c:=true
                else c:=false;
            inc(nt);
        until c;
     
        m[3][2]:=1-x1;
        m[2][3]:=1-y1;
     
        m[3][3] := 1 - m[1][3] - m[2][3];
     
        for i:=1 to 3 do
        begin
            for j:=1 to 3 do write(m[i][j]:15:12, ' ');
            writeln;
        end;
        writeln;
     
        { vérification des lignes }
        for i:= 1 to 3 do
        begin
          x := 0;
          for j:= 1 to 3 do
          begin
               x := x + m[i][j];
          end;
          writeln ('ligne   ',i,'  = ',x);
        end;
        writeln;
     
        { vérification des colonnes }
        for j:= 1 to 3 do
        begin
          x := 0;
          for i:= 1 to 3 do
          begin
               x := x + m[i][j];
          end;
          writeln ('colonne ',j,'  = ',x);
        end;
        writeln;
     
        writeln('nombre de tours = ',nt);
        readln;
    end.
    Je préfère que l'affichage de la matrice représente à l'écran l'aspect d'une matrice, et j'ai également ajouté la vérification de la somme obtenue pour chaque ligne/colonne.

    Egalement ajoutée la variable nt (pour 'nombre de tours'), incrémentée pour chaque tour fait dans les boucles repeat..until, c'était pour me faire une idée du nombre de tirages à faire pour arriver au résultat.
    C'est généralement assez rapide, mais je suis tombé parfois sur sur des nombres de tours assez élevés (genre 500 ou 600), cela étant bien entendu dû à la 1ère valeur tirée : si elle est proche de 1, il devient plus difficile de satisfaire ensuite les conditions.

    Concernant l'indentation du code et son "aération" avec des sauts de ligne, il faut en prendre l'habitude tout de suite.
    Comme tu l'as vu, ça rend la lecture nettement plus facile, et donc également la compréhension et la maintenance du code.

  11. #11
    Membre régulier Avatar de magicstar
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations forums :
    Inscription : Mars 2007
    Messages : 136
    Points : 84
    Points
    84
    Par défaut
    SUPER! j'ai compilé le programme et il a marché MERCI BEAUCOUUUUUUUP droggo

  12. #12
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 950
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 950
    Points : 5 667
    Points
    5 667
    Par défaut
    Ho,
    Citation Envoyé par magicstar
    SUPER! j'ai compilé le programme et il a marché MERCI BEAUCOUUUUUUUP droggo
    C'est toi qui a fait l'essentiel du travail, je n'ai fait qu'une mise en forme, et corrigé une petite erreur, que tu aurais trouvée tout seul, j'en suis sûr.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Une fonction qui génère des matrices aléatoires
    Par deblo16 dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 26/10/2012, 01h31
  2. VBA: Matrice réorganisée aléatoirement, en Random
    Par vatfer dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 12/08/2010, 00h02
  3. Comment remplir une matrice aléatoirement ?
    Par Hamza dans le forum Langage
    Réponses: 21
    Dernier message: 08/12/2007, 19h59
  4. 32 images générées aléatoirement (sans les voir)
    Par jhonnybegood dans le forum Général VBA
    Réponses: 10
    Dernier message: 12/03/2007, 13h03
  5. [matrice aléatoire]
    Par wjean dans le forum Algorithmes et structures de données
    Réponses: 8
    Dernier message: 08/05/2005, 15h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo