Matlab - Generación de N-1 nº naturales aleatorios cuya suma vale N

 
Vista:
sin imagen de perfil
Val: 68
Ha aumentado 1 puesto en Matlab (en relación al último mes)
Gráfica de Matlab

Generación de N-1 nº naturales aleatorios cuya suma vale N

Publicado por Aitor (49 intervenciones) el 17/03/2017 11:20:06
¡Hola!

La verdad es que no se me ocurre qué más probar, el título parece bastante explicativo de por sí...

He probado ésto (http://www.lawebdelprogramador.com/foros/Matlab/703495-Limites-para-generacion-de-numeros-aleatorios.html) pero tarda demasiado tiempo en ejecutar.

1
2
3
4
5
6
7
8
9
10
11
12
clear all
N=1999;
a=0; b=2000;
while 1
r =round( a + (b-a).*rand(1,N));
suma=sum(r);
if sum(r)==2000
    display(r)
    display(suma)
    break;
end
end

Alguna forma de hacer algo lo más eficiente posible?

Muchas gracias de antemano chicos, y un saludo.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de JESUS DAVID ARIZA ROYETH
Val: 3.309
Plata
Ha mantenido su posición en Matlab (en relación al último mes)
Gráfica de Matlab

Generación de N-1 nº naturales aleatorios cuya suma vale N

Publicado por JESUS DAVID ARIZA ROYETH (1818 intervenciones) el 17/03/2017 16:53:09
los números naturales comienzan de 1 y se extienden hasta infinito , en este caso si quieres generar 4 números la suma debe darte 5 por lo que [1 1 1 2] y todas sus permutaciones son las únicas soluciones posibles , si quieres generar 5 números la suma debe darte 6 por lo que [1 1 1 1 2] y todas sus permutaciones son las únicas soluciones posibles, el algoritmo te va a resultar poco eficiente porque la probabilidad de que te salgan todos los números menos uno con el valor de uno y el sobrante con el valor de 2 es muy baja es como tirar 1999 dados de muchísimas caras y que deban caer todos en uno, por lo que lo único que puedes hacer aleatorio aquí es la permutación :

1
2
3
N=2000;
numeros=ones(1,N-1)
numeros(randi([1,N-1],1,1))=2;


espero ser claro con esto , el código lo que hace es generar 1999 unos y luego en alguna posición aleatoria desde 1 hasta 1999 reemplaza un uno por un dos y ahí la respuesta sí da 2000

saludos
https://www.facebook.com/royethmatlab/
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 68
Ha aumentado 1 puesto en Matlab (en relación al último mes)
Gráfica de Matlab

Generación de N-1 nº naturales aleatorios cuya suma vale N

Publicado por Aitor (49 intervenciones) el 17/03/2017 17:08:25
Hola!

El problema ha sido que evidentemente no me he explicado correctamente al no mencionar que el cero estaba incluido...

Aquí dejo una solución a mi problema! Muchas gracias por la atención!
https://es.mathworks.com/matlabcentral/answers/108083-how-to-create-a-random-row-vector-whose-sum-of-elements-and-number-of-elements-is-at-my-desire#answer_116819
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar