Ayuda con programación en C (Matriz estocástica)

Buenas a todos.

Tengo que hacer un problema que me indica que genere una matriz aleatoria y tiene que ser estocástica (es decir, que cada columna de esa matriz sume 1). Se generar la matriz pero no se como hacer para que sumen uno, a ver si me podeis echar un cable.

Este es mi código del programa.

#include<stdio.h>
#include<time.h>
#define N 7

void calcularMatrizAleatoria(float matriz[][N],int util){

int i,j,max=100;
float valor;
srand(time(NULL));

for(i=0; i<util; i++){
for(j=0; j<util; j++){
valor=(rand()%max);
valor/=100;             
matriz[i][j]=valor;
}   

}
}

void escribirMatriz(float matriz[][N], int util){
int i,j;

for(i=0; i<util; i++){
for(j=0; j<util; j++){
printf("Elemento [%d][%d]: %.2f", i, j, matriz[i][j]);           
}   
}   
}

main(){

float matriz[N][N];
int util;
inicio:printf("Cuantos grupos hay? (Siete como maximo) --> ");
scanf("%d",&util);
if(util>7 || util<1){
puts(" --> Tiene que introducir un valor entre 1 y 7 <--");
puts("");
goto inicio;
}

calcularMatrizAleatoria(matriz,util);
escribirMatriz(matriz,util);
puts("");

return 0;

}
[/i][/i]
Así de primeras se me ocurre que al calcular el valor, puedes añadirle una condición tal que sacara números aleatorios hasta sumar uno:

for(i=0; i resto = 0;
for(j=0; jif(j ==0){//para no salir del rango
valor=(rand()%max);
valor/=100;
}else
if(j == util){//el último numero dejamos que no sea aleatorio para que de exactamente 1.
valor = 1-resto;
}else
do{
valor=(rand()%max);
valor/=100;
}while(valor + matriz[i][j-1] < 1);
matriz[i][j]=valor;//te habías dejado la [i]
resto+=valor;
}}

Es algo chapucero, y supongo que hará columnas mas o menos decrecientes, pero puede que funcione.

Si es el primero lo calcula normal. El resto, calcula uno, y si al sumar da 1 o más, calcula uno nuevo. El último se calcula por lo que queda del la suma de los anteriores hasta uno. Resultado, todos suman 1.

Otra cosa, se recomienda no usar goto en C.

Un saludo!
Gracias, ahora después probaré como me has dicho :)

Si se desaconseja el goto, que puedo utilizar para hacer lo mismo?
Divide cada elemento por la suma total de su columna.
Para quitar el goto
Inicializa util a 0:

int util=0;

printf("Cuantos grupos hay? (Siete como maximo) --> ");
scanf("%d",&util);
while (util>7 || util<1){

puts(" --> Tiene que introducir un valor entre 1 y 7 <--");
printf("Cuantos grupos hay? (Siete como maximo) --> ");
scanf("%d",&util);
};
...
...
No se me había ocurrido esa forma :)

Gracias a los dos!

Edito: nada, seré yo que estoy espeso pero con el método de Kunshi no me sale y como dice Elelegido no se hacerlo porque no se como sumar todos los valores de una columna... :(
Yo no probé a compilar ni nada, no se si estará del todo correcto.

Para sumar todos los valores e una columna simplemente haz otro for que recorra la matriz y vaya sumando.

for(i=0;isuma=0;
for(j=0;jsuma+=matriz[i][j];
}

Un saludo!
6 respuestas