{"id":394,"date":"2022-10-04T16:27:35","date_gmt":"2022-10-04T14:27:35","guid":{"rendered":"http:\/\/quadern-programacio.recursos.uoc.edu\/?page_id=394"},"modified":"2022-10-04T16:27:35","modified_gmt":"2022-10-04T14:27:35","slug":"4-5-aleatoriedad","status":"publish","type":"page","link":"http:\/\/quadern-programacio.recursos.uoc.edu\/es\/4-5-aleatoriedad\/","title":{"rendered":"4.5. Aleatoriedad"},"content":{"rendered":"<p>Los dise\u00f1os que hasta ahora somos capaces de crear con nuestro c\u00f3digo son algo est\u00e1ticos, est\u00e1n muy constre\u00f1idos por los valores que definimos. Sin embargo, podemos dotar a nuestros dise\u00f1os de algo m\u00e1s de \u00abvida\u00bb introduci\u00e9ndoles cierta aleatoriedad. El uso de la aleatoriedad es constante en proyectos de computaci\u00f3n creativa para dotar de mayor \u00abnaturalidad\u00bb y hacer m\u00e1s org\u00e1nicos nuestros dise\u00f1os. La naturaleza es un gran ejemplo de aleatoriedad: si tomamos por ejemplo las nubes, aunque todas comparten caracter\u00edsticas similares, nunca veremos dos nubes id\u00e9nticas. Esta organicidad seremos capaces de simularla utilizando algunos m\u00e9todos de P5.<\/p>\n<p>En P5.js disponemos del m\u00e9todo <span class=\"courier\">random()<\/span> para generar valores aleatorios que podremos utilizar en nuestros <em>sketches<\/em>. Veamos c\u00f3mo lo podemos utilizar:<\/p>\n<pre>function setup(){\r\n    createCanvas(400, 400);\r\n}\r\n\r\nfunction draw() {\r\n    let randomValue = random(0, 255);\r\n    background(randomValue);\r\n}<\/pre>\n<p>Si ejecutamos el c\u00f3digo anterior, podremos ver c\u00f3mo el color de fondo de nuestro <em>sketch<\/em> var\u00eda r\u00e1pidamente tomando diferentes valores dentro de una escala de grises. Analicemos el c\u00f3digo para ver qu\u00e9 es lo que est\u00e1 ocurriendo exactamente. En el <span class=\"courier\">setup()<\/span> creamos nuestro <em>canvas<\/em> con unas dimensiones de 400 \u00d7 400 px; hasta aqu\u00ed nada nuevo. Dentro del <span class=\"courier\">draw()<\/span> estamos creando una variable llamada <span class=\"courier\">randomValue<\/span> a la que le asignamos un valor que viene definido por el m\u00e9todo <span class=\"courier\">random<\/span>, al que le estamos pasando dos par\u00e1metros. Estos dos par\u00e1metros definen el rango de valores entre los que el m\u00e9todo <span class=\"courier\">random<\/span> \u00abelige\u00bb. En nuestro caso, hemos definido los valores 0 y 255, por lo que <span class=\"courier\">random<\/span> cada vez que se ejecute devolver\u00e1 (como cuando cre\u00e1bamos una funci\u00f3n con <span class=\"courier\">return<\/span>) un valor entre 0 y 255. Posteriormente, utilizamos este valor que <span class=\"courier\">random<\/span> ha devuelto y que hemos almacenado en la variable <span class=\"courier\">randomValue<\/span> para establecer el color de nuestro fondo. Al ser valores entre 0 y 255, nuestro fondo cambiar\u00e1 entre distintos valores de gris.<\/p>\n<p>Ahora bien, \u00bfpor qu\u00e9 cambia constantemente el valor del color? Si recordamos de temas anteriores, el <span class=\"courier\">draw()<\/span> se ejecuta constantemente en bucle a una velocidad de 60 fotogramas (<em>frames<\/em>) por segundo. Por ello, el m\u00e9todo <span class=\"courier\">random<\/span> se estar\u00e1 ejecutando continuamente y devolviendo un valor distinto cada vez. Normalmente, querremos que nuestro <em>sketch<\/em> se ejecute a 60 <em>frames<\/em> por segundo, pero en algunos casos podemos ralentizar e incluso parar por completo la velocidad de refresco, lo que nos puede resultar \u00fatil a la hora de crear <em>sketches<\/em> \u00abest\u00e1ticos\u00bb o para poder apreciar detalles de lo que realiza nuestro c\u00f3digo que a 60 FPS se nos escapen.<\/p>\n<p>Para alterar la velocidad de refresco de nuestros <em>sketches<\/em>, podemos usar el m\u00e9todo <span class=\"courier\">frameRate()<\/span>:<\/p>\n<pre>function setup(){\r\n    createCanvas(400, 400);\r\n    frameRate(2);\r\n}\r\n\r\nfunction draw() {\r\n    let randomValue = random(0, 255);\r\n    background(randomValue);\r\n}<\/pre>\n<p>Como par\u00e1metro a <span class=\"courier\">frameRate()<\/span> le pasamos el n\u00famero de fotogramas por segundo al que queremos que se ejecute nuestro <em>sketch<\/em>. En el ejemplo anterior le hemos dado una velocidad de 2 fotogramas por segundo, por lo que ahora nuestro color de fondo cambiar\u00e1 dos veces cada segundo en lugar de estar cambiando 60 veces por segundo.<\/p>\n<p>Si queremos parar por completo el refresco y que el c\u00f3digo que tenemos en el <span class=\"courier\">draw()<\/span> se ejecute una \u00fanica vez, lo podemos hacer con <span class=\"courier\">noLoop()<\/span>:<\/p>\n<pre>function setup(){\r\n    createCanvas(400, 400);\r\n    noLoop();\r\n}\r\n\r\nfunction draw() {\r\n    let randomValue = random(0, 255);\r\n    background(randomValue);\r\n}<\/pre>\n<p>El m\u00e9todo <span class=\"courier\">noLoop()<\/span> no precisa de par\u00e1metros y lo que hace es que limita la ejecuci\u00f3n del <span class=\"courier\">draw()<\/span> a una \u00fanica vez. De esta manera, no veremos cambio alguno y si queremos que el m\u00e9todo <span class=\"courier\">random()<\/span> nos devuelva un nuevo valor y que consecuentemente el fondo cambie de color, deberemos ejecutar de nuevo nuestro <em>sketch<\/em>.<\/p>\n<p>Una vez hecho este inciso para explicar c\u00f3mo podemos alterar la ejecuci\u00f3n de nuestro <em>sketch<\/em> mediante <span class=\"courier\">frameRate()<\/span> y <span class=\"courier\">noLoop()<\/span>, regresemos a la aleatoriedad con el m\u00e9todo <span class=\"courier\">random()<\/span>. En los ejemplos anteriores hemos utilizado dos par\u00e1metros para definir el rango de valores que el m\u00e9todo nos va a devolver, pero podemos usarlo tambi\u00e9n de otros modos:<\/p>\n<pre>\/\/ Sin par\u00e1metros \r\n\/\/ Valores entre 0 y 1\r\nlet value = random();\r\n\r\n\/\/ Con un par\u00e1metro\r\n\/\/ Valores entre 0 y el valor del par\u00e1metro\r\nlet value = random(255);\r\n\r\n\/\/ Con dos par\u00e1metros\r\n\/\/ Valores entre el primer y el segundo par\u00e1metro\r\nlet value = random(100, 200);<\/pre>\n<p>Si usamos la consola para imprimir alguno de estos valores, nos daremos cuenta de una peculiaridad: los valores que nos devuelve <span class=\"courier\">random()<\/span> son siempre valores decimales. Esto puede ser algo deseable o no seg\u00fan el caso, por lo que veamos c\u00f3mo podemos transformar los n\u00fameros decimales en enteros usando las funciones <span class=\"courier\">int()<\/span>, <span class=\"courier\">round()<\/span>, <span class=\"courier\">floor()<\/span> y <span class=\"courier\">ceil()<\/span>:<\/p>\n<pre>let value = 14.6604;\r\n\r\n\/\/ int() se queda con la parte entera del valor\r\nlet intValue = int(value);\r\n\/\/ intValue valdr\u00e1 14\r\n\r\n\/\/ round() redondea al entero m\u00e1s cercano\r\nlet roundValue = round(value);\r\n\/\/ roundValue valdr\u00e1 15\r\n\r\n\/\/ floor() redondea hacia abajo\r\nlet floorValue = floor(value);\r\n\/\/ floorValue valdr\u00e1 14\r\n\r\n\/\/ ceil() redondea hacia arriba\r\nlet ceilValue = ceil(value);\r\n\/\/ ceilValue valdr\u00e1 15<\/pre>\n<p>La combinaci\u00f3n de la aleatoriedad con los bucles nos puede resultar de bastante provecho. Con los bucles tenemos la capacidad de repetir un motivo m\u00faltiples veces por nuestro c<em>anvas<\/em>, mientras que con la aleatoriedad podemos dotar a cada uno de estos elementos de cierta variaci\u00f3n para hacer que nuestros dise\u00f1os sean m\u00e1s din\u00e1micos.<\/p>\n<p>Pongamos como ejemplo el patr\u00f3n sencillo que creamos mediante bucles anidados. Si antes de dibujar cada c\u00edrculo creamos una variable a la que asignamos un valor aleatorio y utilizamos esa variable para establecer el di\u00e1metro del c\u00edrculo, tendremos un patr\u00f3n con un espaciado regular pero el tama\u00f1o de cada elemento ser\u00e1 distinto.<\/p>\n<p><figure id=\"attachment_134\" aria-describedby=\"caption-attachment-134\" style=\"width: 800px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" class=\"size-full wp-image-134\" src=\"\/wp-content\/uploads\/2022\/10\/PID_00290094_050.jpg\" alt=\"\" width=\"800\" height=\"336\" srcset=\"\/wp-content\/uploads\/2022\/10\/PID_00290094_050.jpg 800w, \/wp-content\/uploads\/2022\/10\/PID_00290094_050-300x126.jpg 300w, \/wp-content\/uploads\/2022\/10\/PID_00290094_050-768x323.jpg 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><figcaption id=\"caption-attachment-134\" class=\"wp-caption-text\">Figura 51. Aleatoriedad dentro de bucles <span class=\"courier\">for<\/span><br \/>Fuente: elaboraci\u00f3n propia.<\/figcaption><\/figure>En el ejemplo de la figura 51 hemos usado un <span class=\"courier\">random(10, separation)<\/span> para que los c\u00edrculos tengan un di\u00e1metro aleatorio de entre 10 px y la separaci\u00f3n entre cada c\u00edrculo, para que de esta manera no se superpongan. En el <span class=\"courier\">setup()<\/span> hemos incluido tambi\u00e9n un <span class=\"courier\">noLoop()<\/span>, para que el <span class=\"courier\">draw()<\/span> se ejecute una \u00fanica vez y no tengamos valores aleatorios 60 veces por segundo.<\/p>\n<p>Podemos aplicar los valores aleatorios a los par\u00e1metros de dibujo que queramos. Podr\u00edamos por ejemplo recuperar el ejemplo del patr\u00f3n de ojos para que el color del iris de cada ojo vaya cambiando cada vez que dibujemos un ojo nuevo. Para ello, podr\u00edamos usar tres valores aleatorios para definir un color en RGB, pero de esta manera no tendr\u00edamos demasiado control sobre el resultado final, y ser\u00edan colores muy dispares entre s\u00ed. Una manera de tener mayor control sobre el color final es usando <span class=\"courier\"><a href=\"https:\/\/p5js.org\/reference\/#\/p5\/colorMode\" target=\"_blank\" rel=\"noopener\">colorMode()<\/a><\/span>\u00a0para cambiar el modo de color de RGB a HSB (tono, saturaci\u00f3n, brillo). As\u00ed, podr\u00edamos establecer un tono fijo y variar el brillo y la saturaci\u00f3n o introducir una peque\u00f1a variaci\u00f3n en el tono tambi\u00e9n:<\/p>\n<figure id=\"attachment_136\" aria-describedby=\"caption-attachment-136\" style=\"width: 800px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" class=\"size-full wp-image-136\" src=\"\/wp-content\/uploads\/2022\/10\/PID_00290094_051.jpg\" alt=\"\" width=\"800\" height=\"565\" srcset=\"\/wp-content\/uploads\/2022\/10\/PID_00290094_051.jpg 800w, \/wp-content\/uploads\/2022\/10\/PID_00290094_051-300x212.jpg 300w, \/wp-content\/uploads\/2022\/10\/PID_00290094_051-768x542.jpg 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><figcaption id=\"caption-attachment-136\" class=\"wp-caption-text\">Figura 52. Aleatoriedad en el color<br \/>Fuente: elaboraci\u00f3n propia.<\/figcaption><\/figure>\n<p>Por defecto, el modo de color HSB acepta valores que van de 0 a 360 para el tono y de 0 a 100 para la saturaci\u00f3n y el brillo. En el ejemplo de la figura 52 hemos modificado un poco la funci\u00f3n <span class=\"courier\">eye()<\/span>, ya que ahora el color no viene dado por un par\u00e1metro externo, sino que lo definimos dentro de la propia funci\u00f3n usando <span class=\"courier\">random()<\/span> con distintos rangos para tener ligeras variaciones de color en el iris.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Los dise\u00f1os que hasta ahora somos capaces de crear con nuestro c\u00f3digo son algo est\u00e1ticos, est\u00e1n muy constre\u00f1idos por los valores que definimos. Sin embargo, podemos dotar a nuestros dise\u00f1os de algo m\u00e1s de \u00abvida\u00bb introduci\u00e9ndoles cierta aleatoriedad. El uso de la aleatoriedad es constante en proyectos de computaci\u00f3n creativa para dotar de mayor \u00abnaturalidad\u00bb [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":[],"acf":[],"_links":{"self":[{"href":"http:\/\/quadern-programacio.recursos.uoc.edu\/es\/wp-json\/wp\/v2\/pages\/394"}],"collection":[{"href":"http:\/\/quadern-programacio.recursos.uoc.edu\/es\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"http:\/\/quadern-programacio.recursos.uoc.edu\/es\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"http:\/\/quadern-programacio.recursos.uoc.edu\/es\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/quadern-programacio.recursos.uoc.edu\/es\/wp-json\/wp\/v2\/comments?post=394"}],"version-history":[{"count":1,"href":"http:\/\/quadern-programacio.recursos.uoc.edu\/es\/wp-json\/wp\/v2\/pages\/394\/revisions"}],"predecessor-version":[{"id":395,"href":"http:\/\/quadern-programacio.recursos.uoc.edu\/es\/wp-json\/wp\/v2\/pages\/394\/revisions\/395"}],"wp:attachment":[{"href":"http:\/\/quadern-programacio.recursos.uoc.edu\/es\/wp-json\/wp\/v2\/media?parent=394"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}