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
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
Hi,
Pout moi, ton énoncé contient une erreur conceptuelle qui le rend insoluble tel quel.Envoyé par magicstar
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.
Bonsoir,
Pour moi ça a l’aire réalisable,
Remarque: Sur mon algo la somme des cases doit donner 100.
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.
Ho,
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é.Envoyé par Ultima
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.
Bonsoir,
Un nombre généré à partir d’un nombre généré aléatoirement est lui-même aléatoire.Envoyé par droggo
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.
Ho,
Ca dépend de la fonction.Envoyé par Ultima
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.
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).Envoyé par Ultima
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).
Bonsoir,
est ce qu'un code comme celui-ci peut marcher??( pour une matrice de 3*3)
MERCIIIIII
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.
Ho,
Je n'ai pas de compilateur sous la main, mais je verrai plus tard.Envoyé par magicstar
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 )
J'ai ajouté l'appel de randomize pour initialiser le générateur aléatoire.
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.
L'indentation met en évidence, dans la dernière partie
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.
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;
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
Avec cette correction, ça devrait marcher, sauf problème dû aux approximations des réels.
Code : Sélectionner tout - Visualiser dans une fenêtre à part m[3][3] := 1 - m[1][3] - m[2][3];
Apparamment, j'avais vu des difficultés là où il y en a peu, ou pas. C'est mon esprit "tordu", en quelque sorte
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:
pourquoi pas
Code : Sélectionner tout - Visualiser dans une fenêtre à part m[3][3]:=1-m[1][3]-m[2][3]
Code : Sélectionner tout - Visualiser dans une fenêtre à part m[3][3]:=1-m[3][1]-m[3][2]
Hoï,
C'est au choix, l'un ou l'autre. J'ai testé, ça donne bien la bonne valeur, donc ça marche.Envoyé par magicstar
J'ai légèrement modifié la fin, pour pouvoir contrôler:
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.
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.
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.
SUPER! j'ai compilé le programme et il a marché MERCI BEAUCOUUUUUUUP droggo
Ho,
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.Envoyé par magicstar
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager