[Yo soy la división de un número de la población en distintas matrices y quiere probar mi código mediante el uso de números aleatorios por ahora.]

Pregunta rápida chicos y gracias por su ayuda de antemano –

Si uso;

 100*rand(9,1)

¿Cuál es la mejor manera de hacer que estos 9 números de sumar 100?

Me gustaría 9 números aleatorios entre 0 y 100 que suman 100.

Hay un sistema de comando que hace esto porque me parece que no puede encontrar.

InformationsquelleAutor Tetra | 2011-11-09

4 Comentarios

  1. 74

    Veo el error tan a menudo, la sugerencia de que para generar números aleatorios con una determinada suma, uno sólo utiliza un conjunto aleatorio uniforme, y sólo la escala. Pero el resultado es verdaderamente uniformemente al azar si lo haces de esa manera?

    Pruebe este sencillo test en dos dimensiones. Generar una gran muestra aleatoria, entonces la escala a la suma de 1. Voy a usar bsxfun para hacer la escala.

    xy = rand(10000000,2);
    xy = bsxfun(@times,xy,1./sum(xy,2));
    hist(xy(:,1),100)

    Si eran verdaderamente uniformemente al azar, entonces la coordenada x sería uniforme, como sería la coordenada. Cualquier valor sería igual de probable que suceda. En efecto, para dos puntos a sumar 1 deben estar en la línea que conecta los dos puntos (0,1), (1,0) en el (x,y) del plano. Para que los puntos sean uniforme, ningún punto a lo largo de esa línea debe ser igualmente probables.

    Números aleatorios que añadir a 100: Matlab

    Claramente la uniformidad falla al utilizar la solución de escalamiento. Cualquier punto en que la línea NO es igualmente probable. Podemos ver ocurriendo lo mismo en 3-dimensiones. Ver que en el 3-d de la figura aquí, los puntos en el centro de la triangular, la región más densamente poblada. Esto es un reflejo de la falta de uniformidad.

    xyz = rand(10000,3);
    xyz = bsxfun(@times,xyz,1./sum(xyz,2));
    plot3(xyz(:,1),xyz(:,2),xyz(:,3),'.')
    view(70,35)
    box on
    grid on

    Números aleatorios que añadir a 100: Matlab

    De nuevo, la simple solución de escalamiento falla. Simplemente NO producir verdaderamente uniforme de los resultados sobre el dominio de interés.

    Podemos hacer mejor? Bien, sí. Una solución simple en 2-d es generar un único número aleatorio que designa la distancia a lo largo de la línea que conecta los puntos (0,1) y 1,0).

    t = rand(10000000,1);
    xy = t*[0 1] + (1-t)*[1 0];
    hist(xy(:,1),100)

    Números aleatorios que añadir a 100: Matlab

    Se puede demostrar que CUALQUIER punto a lo largo de la línea definida por la ecuación x+y = 1, en la unidad de la plaza, ahora es igual de probable que haya sido elegido. Esto se refleja por el tratado de niza, tv de histograma.

    ¿El tipo de truco sugerido por David Schwartz trabajo en n-dimensiones? Claramente lo hace en 2-d, y la figura de abajo sugiere que lo hace en 3-dimensiones. Sin una profunda reflexión sobre el asunto, creo que va a trabajar para este básica del caso en cuestión, en n-dimensiones.

    n = 10000;
    uv = [zeros(n,1),sort(rand(n,2),2),ones(n,1)];
    xyz = diff(uv,[],2);
    
    plot3(xyz(:,1),xyz(:,2),xyz(:,3),'.')
    box on
    grid on
    view(70,35)

    Números aleatorios que añadir a 100: Matlab

    También se puede descargar de la función randfixedsum desde el archivo de intercambio, Roger de Stafford contribución. Esta es una solución más general para generar verdaderamente aleatorio uniforme establece en la unidad de hiper-cubo, con cualquier suma fija. Por lo tanto, para generar al azar de los conjuntos de puntos que se encuentran en la unidad 3-cubo, sujeto a la restricción de que la suma de 1,25…

    xyz = randfixedsum(3,10000,1.25,0,1)';
    plot3(xyz(:,1),xyz(:,2),xyz(:,3),'.')
    view(70,35)
    box on
    grid on

    Números aleatorios que añadir a 100: Matlab

    • Sé que esto es una vieja pregunta, pero, ¿puede alguien explicar esta respuesta para mí? Cómo se puede generar un único número aleatorio que designa la distancia a lo largo de la línea que conecta los puntos (0,1) y 1,0). Se puede demostrar que CUALQUIER punto a lo largo de la línea definida por la ecuación x+y = 1, en la unidad de la plaza, ahora es igual de probable que haya sido elegido.»? Esto es incluso precisa? Parte de mi confusión es que el código de Matlab que él había puesto para la prueba sólo demostró que los números aleatorios son uniformes, sin embargo ellos no fueron escalados a 1…que es el punto entero.
    • el problema está resuelto, es «seleccionar un par de números x, y tales que x+y = 1.» La solución es: «, seleccione x en el intervalo [0, 1] y, a continuación, calcular y = 1 – x». Esto asegura que el par (x, y) es uniformemente seleccionado desde el universo de todos los posibles pares. El histograma muestra de que funciona. David Schwartz respuesta proporciona una generalización de más de dos dimensiones (es decir, las tuplas con más de dos elementos).
    • Gracias por tu respuesta! Su re-formulación de la solución hecho clic en él para mí. 🙂
    • Es bastante fácil de probar por 3 dimensiones: vamos los dos al azar los números p y q, entonces si p < p entonces (p, q) se encuentra dentro de un triángulo (0,0)-(0,1)-(1,1) y si p > q, (q, p) se encuentra dentro de ese triángulo. Restando el mayor número desde el 1 de mapas en el triángulo situado a (0,1)-(0,0)-(1,0) cual es la proyección de la zona deseada en el plano xy y z es simplemente la diferencia entre p y q como se desee. Para dimensiones superiores creo que el hecho de que usted puede empacar N N-D hyperpyramids en un N-D hipercubo significa que la clasificación de la N-ésima del número al azar es equivalente a elegir un adecuado hyperpyramid.
  2. 59

    Una forma sencilla es elegir 8 números aleatorios entre 0 y 100. Agregar el 0 y el 100 a la lista de 10 números. Ordenarlas. Luego de la salida de la diferencia entre cada una de las sucesivas par de números. Por ejemplo, aquí hay 8 números aleatorios entre 0 y 100:

    96, 38, 95, 5, 13, 57, 13, 20

    Para agregar 0 y 100 y ordenar.

    0, 5, 13, 13, 20, 38, 57, 95, 96, 100

    Ahora resta:

    5-0 = 5

    13-5 = 8

    13-13 = 0

    20-13 = 7

    38-20 = 18

    57-38 = 19

    95-57 = 38

    96-95 = 1

    100-96 = 4

    Y ahí lo tienen, nueve números que se suma a 100: 0, 1, 4, 5, 7, 8, 18, 19, 38. Es que yo tengo un cero y un uno sólo era un extraño, un poco de suerte.

    • Impresionante! Me encanta. He adaptado el método para crear una serie de números aleatorios que se suma a 0. Esto me permite crear al azar con alteraciones no red efecto. (I. e. en un movimiento del juego sprite parece que se mueve al azar, más o menos, pero nunca sale de la pantalla. ^^)
    • Esto sólo funciona cuando está permitido el uso de cualquier número aleatorio entre 0 y su suma! Por ejemplo, esto no funciona cuando el rango de número aleatorio es menor que la suma deseada.
    • El método es el sonido pero esta respuesta podría utilizar otra edición … Aquí está una lista de 8 números … añadir 0 y 100 (y en silencio gota 20 de la lista para hacer un total de nueve números). La respuesta concluye con «nueve números que suma hasta 100:» y procede a la lista de ocho números. La tendencia general es tomar una lista de N números, crear una lista de N+2 números mediante la inserción de 0 y 100, diff hasta un total de N+1 números y ordenar el resultado.
    • He arreglado el ejemplo, que creo que fue un simple error. Creo que es un engaño para clasificar a la final de la tupla, pero se los dejo para el autor original para decidir.
    • python ejemplo: >>> a = [0] + ordenada([azar.aleatorio()*100 para _ en el rango(9-1)]) + [100] >>> b = [a[i+1] – a[i] for i in range(len(a)-1)] >>> suma(b) == 100
  3. 3

    No es demasiado tarde para dar la respuesta correcta

    Vamos a hablar de muestreo X1…XN en el intervalo [0…1] tales que la Suma(X1, …, XN) es igual a 1. Entonces usted podría escalarlo a 100

    Esto se llama Distribución Dirichlet, y a continuación está el código de ejemplo de ella. El caso más simple es cuando todos los parámetros son iguales a 1, entonces todas las distribuciones marginales para X1, …, XN sería U(0,1). En el caso general, con parámetros diferentes de 1s, distribuciones marginales podría tener picos.

    —————– tomado de aquí ———————

    La de Dirichlet es un vector de la unidad de escala gamma variables aleatorias, normalizado por la suma de los mismos. Por lo tanto, con ninguna comprobación de errores, de esta manera se consigue que:

    a = [1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0]; // 9 numbers to sample
    n = 10000;
    r = drchrnd(a,n)
    
    function r = drchrnd(a,n)
      p = length(a);
      r = gamrnd(repmat(a,n,1),1,n,p);
      r = r ./ repmat(sum(r,2),1,p);
  4. -1

    Tomar una lista de N – 1 números, crear una lista de N + 1 números mediante la inserción de 0 y 100, de ordenación de la lista, y diff hasta un total de N números.

    • Esto no resulta en una distribución uniforme.

Dejar respuesta

Please enter your comment!
Please enter your name here