Anuncio

Colapsar
No hay ningún anuncio todavía.

Vector aleatorio

Colapsar
X
 
  • Filtro
  • Hora
  • Mostrar
Borrar todo
nuevos mensajes

  • Matlab Vector aleatorio

    Muy buenas,

    Hace unas semanas pregunté sobre cómo crear todas las posibles combinaciones de unos y ceros de un vector con el número de unos dado. Entonces xXminombreXx me enseñó a utilizar una función recursiva para hacerlo.

    Pues bien, sigo con el proyecto y después de mucho pelearme con él está casi acabado. Me queda una última parte donde se debe utilizar algo así como el método de Monte Carlo. Para esto necesito ir creando un vector aleatorio de unos y ceros con el número de unos a poner fijado por mi . Sé cómo crear un vector aleatorio de unos y ceros, pero no sé cómo hacer que salgan el número de unos que yo quiero.
    Una vez creado éste, tengo que crear otro moviendo un uno y así sucesivamente, pero siempre con el mismo número de unos. ¿A alguien se le ocurre algo?
    Muchísimas gracias

  • #2
    Re: Vector aleatorio

    ¿Qué tal generar un vector del mismo tamaño lleno con números aleatorios y ordenar el segundo vector según el primero? Muchos lenguajes tienen algún comando para ordenar... y si no es así, los métodos para ordenar son harto conocidos.

    Saludos,

    Al
    Don't wrestle with a pig in the mud. You'll both get dirty, but the pig will enjoy it. - Parafraseando a George Bernard Shaw

    Comentario


    • #3
      Re: Vector aleatorio

      Pero para qué quiero ordenarlos? quiero decir... ¿eso me ayudaría a tener el número de unos que yo quiera?

      Saludos

      Comentario


      • #4
        Re: Vector aleatorio

        Necesito generar vectores aleatorios de unos y ceros con el número de unos introducido por mi, sólo eso.

        Comentario


        • #5
          Re: Vector aleatorio

          No vale la pena que te lo explique si no me respondes primero esto: ¿Necesitas un vector aleatorio cada vez o necesitas un vector aleatorio inicial y a partir de este vas a generar todas las otras combinaciones posibles moviendo sólo un 1 cada vez? Yo entiendo que si vas a hacer algo parecido al método Monte Carlo, tendrías que generar un vector aleatorio cada vez, habiendo incluso la posibilidad de que un vector cualquiera aparezca mas de una vez.

          Saludos,

          Al
          Última edición por Al2000; 29/06/2012, 02:30:10. Motivo: Error de tipeo.
          Don't wrestle with a pig in the mud. You'll both get dirty, but the pig will enjoy it. - Parafraseando a George Bernard Shaw

          Comentario


          • #6
            Re: Vector aleatorio

            Exacto, necesito crear un vector aleatorio cada vez, calcularle unas cuantas cosas y a por el siguiente. Así hasta el número de iteraciones que le diga. No necesito todas las posibles combinaciones (de hecho el vector es de 64 componentes, así que hacer todas las posibles combinaciones no es muy factible).
            Lo que podría hacer (y creo que por ahí iba tu respuesta) es crear un vector con el número de unos y ceros que yo quiero y además crear cada vez un segundo vector aleatorio de 64 componentes con valores del 1 al 64 aleatoriamente distribuidos en el vector. Después ordeno el primer vector según el segundo (es decir, si la primera componente del segundo vector es 27, pondremos la primera componente del primer vector en la posición 27).
            ¿Cómo lo ves? ¿Es factible esto?

            Saludos

            Comentario


            • #7
              Re: Vector aleatorio

              Bueno, mi primera respuesta estaba pensada para un caso mas general. Si tan sólo deseas generar un vector aleatorio con un número de 1's prefijado, creo que lo mas sencillo sería algo así:

              Haz clic en la imagen para ampliar

Nombre:	VAN1.PNG
Vitas:	1
Tamaño:	5,8 KB
ID:	301370

              Creo que el código en Mathcad es entendible. Lo que hace es simplemente entrar en un bucle que determina una posición al azar e introduce un 1 en esa posición hasta haber introducido todos los 1's especificados.

              Saludos,

              Al
              Don't wrestle with a pig in the mud. You'll both get dirty, but the pig will enjoy it. - Parafraseando a George Bernard Shaw

              Comentario


              • #8
                Re: Vector aleatorio

                Creo que en Matlab podría ser algo así...

                function randomvector(vector,n)
                %vector es un vector de ceros con la longitud deseada
                % n es el número de 1 a meter
                i=0;
                while i<n
                k= floor(1 +(length(vector)).*rand(1));
                if vector(k)==1
                continue
                else
                vector(k)=1;
                i=i+1;
                end

                end
                vector
                end



                ¿Qué opinas?
                Última edición por ruato; 29/06/2012, 20:34:10.

                Comentario


                • #9
                  Re: Vector aleatorio

                  ¿No puedes hacer la pregunta para una desigualdad? Algo asi:

                  Código:
                  if vector(k)<>1
                    vector(k)=1;
                    i=i+1;
                  end
                  Por otra parte, y si has de llamar la función muchas veces, sería mas eficiente si precargas una variable con la longitud del vector.

                  Bueno, en todo caso lo que tipeaste parece hacer el trabajo, haciendo la salvedad de que yo no conozco el Mathlab.

                  Saludos,

                  Al
                  Don't wrestle with a pig in the mud. You'll both get dirty, but the pig will enjoy it. - Parafraseando a George Bernard Shaw

                  Comentario


                  • #10
                    Re: Vector aleatorio

                    Si lo quieres hacer algo más eficiente, puedes hacer lo siguente, pero que conste que lo que digo es más un reto mental que otra cosa por si te aburres.

                    El código que tienes funciona perfecto, pero al escoger un lugar aleatorio puede suceder que ya tenga un 1 metido. Esto lo arreglas haciendo un "continue" en ese caso, podría pasar sin embargo, que el aleatorio coja muchas veces el mismo lugar haciendo que la función tarde, por así decirlo. La velocidad a la que funciona un ordenador hace que la probabilidad de que pase esto de manera que se note sea muy, muy pequeña, sin embargo si se nota con vectores grandes. Prueba a poner:
                    >> vector = zeros(1,100000);
                    >> randomvector(vector, 99999);

                    Y verás como tarda un rato.
                    Mi reto es que modifiques el código de manera que esto no pase, es decir, que el random coja aleatoriamente una posición vacía, si lo consigues, observarás que esas dos lineas de arriba se ejecutan casi instantaneamente, porque la probabilidad de que encuentre un lugar ocupado es 0, y el código simplemente mete 99999 1s en un vector.

                    Te aviso que puede ser difícil, y el código queda algo complicado, así que si no tienes tiempo no lo intentes.

                    Un saludo y suerte con tu trabajo.
                    [TEX=null]\begin{pmatrix}0 & 0 \\1 & 0\end{pmatrix}[/TEX]
                    [TEX=null] \frac{1}{\pi} = \frac{2\sqrt{2}}{9801} \sum^\infty_{k=0} \frac{(4k)!(1103+26390k)}{(k!)^4 396^{4k}}[/TEX]

                    Comentario


                    • #11
                      Re: Vector aleatorio

                      Al2000, con una desigualdad queda más "limpio" el programa, gracias.
                      xXminombreXx, utilizando el programa con un vector de 4 componentes y 2 unos y enseñándomelo todo para ver si se podía mejorar ya me había dado cuenta de ese inconveniente. Sin embargo al ser el vector tan corto no tardaba nada. Por otra parte, lo máximo que voy a utilizar en el programa es un vector de 64 componentes y 32 unos, con lo cual tampoco es que haya una gran probabilidad de que intente meter un 1 donde ya había otro.
                      Sin embargo me apunto el dato y en cuanto acabe todo el jaleo que tengo estas semanas me pondré a ello, así de paso mejoro mi habilidad de programación.

                      De otra parte, si no es mucho pedir ya, sabéis como se le puede decir a un for que vuelva a empezar? Es decir, tenemos:

                      for j=1:máximo
                      if (lo que sea)
                      VUELVE A EMPEZAR EL FOR CON EL VALOR DE J QUE TENÍA EN ESE MOMENTO
                      else
                      haz tales operaciones
                      end
                      end

                      Comentario


                      • #12
                        Re: Vector aleatorio

                        Escrito por ruato Ver mensaje
                        ...
                        De otra parte, si no es mucho pedir ya, sabéis como se le puede decir a un for que vuelva a empezar? Es decir, tenemos:

                        for j=1:máximo
                        if (lo que sea)
                        VUELVE A EMPEZAR EL FOR CON EL VALOR DE J QUE TENÍA EN ESE MOMENTO
                        else
                        haz tales operaciones
                        end
                        end
                        La instrucción "for" se usa cuando el número de iteraciones está completemente determinado. En un caso como el que planteas, donde el número de iteraciones es indeterminado, se usa la instrucción "while". De todas formas te pongo tres variantes:

                        Algunos lenguajes permiten alterar el índice del "for". Esta práctica es muy poco recomendable; con algunos compiladores podría dar error.

                        Código:
                        for j=1:máximo
                          if (lo que sea)
                            VUELVE A EMPEZAR EL FOR CON EL VALOR DE J QUE TENÍA EN ESE MOMENTO
                            j = j - 1
                          else
                            haz tales operaciones
                          end
                        end
                        Algunos lenguajes tienen una instrucción "break" para salir de un bucle inmediatamente.

                        Código:
                        for j=1:máximo
                          while TRUE
                            if (lo que sea)
                              VUELVE A EMPEZAR EL FOR CON EL VALOR DE J QUE TENÍA EN ESE MOMENTO
                            else
                              haz tales operaciones
                              break
                            end
                          end
                        end
                        La manera convencional de hacerlo:

                        Código:
                        j = 1
                        while j <= máximo
                          if (lo que sea)
                            VUELVE A EMPEZAR EL FOR CON EL VALOR DE J QUE TENÍA EN ESE MOMENTO
                          else
                            haz tales operaciones
                            j = j + 1
                          end
                        end
                        Saludos,

                        Al
                        Última edición por Al2000; 01/07/2012, 15:50:34. Motivo: Corregir un "bug" :)
                        Don't wrestle with a pig in the mud. You'll both get dirty, but the pig will enjoy it. - Parafraseando a George Bernard Shaw

                        Comentario


                        • #13
                          Re: Vector aleatorio

                          Lo que te cuenta AL quizás sea más limpio. Sin embargo, lo que puedes hacer es poner simplemente:

                          j--;
                          continue;

                          Y el for se repetirá para ese valor de j.
                          [TEX=null]\begin{pmatrix}0 & 0 \\1 & 0\end{pmatrix}[/TEX]
                          [TEX=null] \frac{1}{\pi} = \frac{2\sqrt{2}}{9801} \sum^\infty_{k=0} \frac{(4k)!(1103+26390k)}{(k!)^4 396^{4k}}[/TEX]

                          Comentario

                          Contenido relacionado

                          Colapsar

                          Trabajando...
                          X