{"id":1198,"date":"2017-09-21T12:43:19","date_gmt":"2017-09-21T17:43:19","guid":{"rendered":"http:\/\/naps.com.mx\/blog\/?p=1198"},"modified":"2018-02-13T20:18:38","modified_gmt":"2018-02-14T02:18:38","slug":"algoritmo-congruencial-multiplicativo-para-la-generacion-de-numeros-pseudo-aleatorios-implementacion-en-java","status":"publish","type":"post","link":"https:\/\/naps.com.mx\/blog\/algoritmo-congruencial-multiplicativo-para-la-generacion-de-numeros-pseudo-aleatorios-implementacion-en-java\/","title":{"rendered":"Algoritmo Congruencial Multiplicativo para la generaci\u00f3n de n\u00fameros pseudo aleatorios: Implementaci\u00f3n en Java"},"content":{"rendered":"<p>El algoritmo congruencial multiplicativo se utiliza para generar n\u00fameros pseudo aleatorios. Veamos a continuaci\u00f3n una explicaci\u00f3n de en qu\u00e9 consiste as\u00ed como su implementaci\u00f3n en Java.<\/p>\n<div id=\"attachment_1214\" style=\"width: 650px\" class=\"wp-caption alignnone\"><a href=\"http:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2017\/09\/articulo-algoritmo-congruencial-multiplicativo.jpeg\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-1214\" class=\"size-full wp-image-1214\" src=\"http:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2017\/09\/articulo-algoritmo-congruencial-multiplicativo.jpeg\" alt=\"algoritmo congruencial multiplicativo\" width=\"640\" height=\"426\" srcset=\"https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2017\/09\/articulo-algoritmo-congruencial-multiplicativo.jpeg 640w, https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2017\/09\/articulo-algoritmo-congruencial-multiplicativo-300x200.jpeg 300w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><\/a><p id=\"caption-attachment-1214\" class=\"wp-caption-text\">Aprende a implementar el algoritmo congruencial multiplicativo en Java<\/p><\/div>\n<p><!--more--><\/p>\n<p>\u00bfC\u00f3mo se generan los n\u00fameros pseudo aleatorios? De seguro al utilizar alguna funci\u00f3n para generar n\u00fameros pseudo aleatorios en cualquier lenguaje de programaci\u00f3n nos preguntamos c\u00f3mo se generan y si podemos confiar en su \u201caleatoriedad\u201d. (En un art\u00edculo de Bravo y Sanchez se menciona que la funci\u00f3n RND del lenguaje QBasic implementaba un algoritmo congruencial lineal)<\/p>\n<p>En la disciplina de la <strong>Simulaci\u00f3n<\/strong> se estudia este aspecto tan importante de los sistemas computacionales.<\/p>\n<h2>Algoritmo Congruencial Multiplicativo<\/h2>\n<p>Un algoritmo que se utiliza para generar n\u00fameros pseudo aleatorios, es el <strong>algoritmo congruencia multiplicativo<\/strong>. Tiene como base al algoritmo congruencia lineal pero conlleva una operaci\u00f3n menos.<\/p>\n<p>La operaci\u00f3n principal es la siguiente:<\/p>\n<span class=\"wp-katex-eq\" data-display=\"false\">X_{i+1} = (aX_{i}) mod (m) <\/span>\n<p>Es decir, se toma una semilla a la que llamaremos <span class=\"wp-katex-eq\" data-display=\"false\"> X_{0} <\/span>. Se multiplica por un n\u00famero a y al resultado de la multiplicaci\u00f3n se divide por m recuperando solo el residuo o m\u00f3dulo de la divisi\u00f3n. Este valor ser\u00e1 X1, y as\u00ed sucesivamente.<\/p>\n<p>Esta operaci\u00f3n nos da un valor entero. Si deseamos un n\u00famero pseudo aleatorio en el intervalo (0,1), debemos realizar la siguiente operaci\u00f3n sobre el n\u00famero anteriormente obtenido.<\/p>\n<span class=\"wp-katex-eq\" data-display=\"false\">R_{i} = X_{i} \/ (m-1)<\/span>\n<p>Es decir, al n\u00famero que produjo la primera operaci\u00f3n, se le divide entre m-1. Nos dar\u00e1 un valor entre 0 y 1.<\/p>\n<p>Para mejorar la eficiencia del algoritmo se deben seguir ciertas condiciones para los valores <span class=\"wp-katex-eq\" data-display=\"false\"> a, m, X_{0} <\/span>. (Banks, Carson, Nelson y Nicol, citados por Garc\u00eda, Garc\u00eda y C\u00e1rdenas (2006).<\/p>\n<h2>Condiciones<\/h2>\n<span class=\"wp-katex-eq\" data-display=\"false\">M = 2^g <\/span>\n<p><span class=\"wp-katex-eq\" data-display=\"false\">A = 3+8k <\/span> o bien <span class=\"wp-katex-eq\" data-display=\"false\"> a = 5+8k <\/span><\/p>\n<p>K = 0,1,2,3,\u2026<\/p>\n<p><span class=\"wp-katex-eq\" data-display=\"false\">X_{0} <\/span> debe ser impar<\/p>\n<p>G debe ser entero<\/p>\n<p>Si se siguen estas condiciones se puede lograr que el algoritmo tenga un per\u00edodo de vida (iteraciones sin encontrar repetici\u00f3n) de m\/4 o de <span class=\"wp-katex-eq\" data-display=\"false\"> 2^{g-2} <\/span><\/p>\n<p>Veamos su implementaci\u00f3n en el lenguaje java.<\/p>\n<h2>Algoritmo Congruencial Multiplicativo en Java<\/h2>\n<pre class=\"lang:java decode:true \">Scanner entrada = new Scanner(System.in);\u00a0\r\nint semilla, cmultiplicativa, caditiva, modulo;\u00a0\r\nint i, numero;\u00a0 \r\ndouble numero2;\u00a0 \r\n\r\nSystem.out.print(\"Escriba una semilla: \");\r\nsemilla = entrada.nextInt();\r\nSystem.out.print(\"Escriba una constante multiplicativa: \");\r\ncmultiplicativa= entrada.nextInt();\r\nSystem.out.print(\"Escriba el m\u00f3dulo: \");\r\nmodulo = entrada.nextInt();\r\n\r\nfor (i=1; i&lt;=20; i++){\r\n   numero = (cmultiplicativa*semilla) % modulo;\u00a0  \r\n   numero2 = (double)numero \/ (double)(modulo-1);\r\n   System.out.printf(\"%d. %d (%.4f)\\n\", i ,numero ,numero2 ); \r\n   semilla = numero;\u00a0 \r\n}<\/pre>\n<h3>Explicaci\u00f3n<\/h3>\n<ul>\n<li><strong>Scanner entrada = new Scanner(System.in);<\/strong>\u00a0 Para recibir datos del teclado del usuario<\/li>\n<li><strong>int semilla, cmultiplicativa, caditiva, modulo;<\/strong>\u00a0 Variables que guardan los valores necesarios: semilla, constante multiplicativa, constante aditiva, valor para dividir y obtener el m\u00f3dulo o residuo.<\/li>\n<li><strong>int i, numero;<\/strong>\u00a0 i se usa en el ciclo for, y n\u00famero recibir\u00e1 el resultado del siguiente n\u00famero pseudo aleatorio.<\/li>\n<li><strong>double numero2;\u00a0<\/strong> Valor que tendr\u00e1 el n\u00famero pseudo aleatorio en el rango 0 a 1.<\/li>\n<\/ul>\n<p>Las siguientes l\u00edneas solicitan los datos al usuario.<\/p>\n<ul>\n<li><strong>System.out.print(\u00abEscriba una semilla: \u00ab);<\/strong><\/li>\n<li><strong>semilla = entrada.nextInt();<\/strong><\/li>\n<li><strong>System.out.print(\u00abEscriba una constante multiplicativa: \u00ab);<\/strong><\/li>\n<li><strong>cmultiplicativa= entrada.nextInt();<\/strong><\/li>\n<li><strong>System.out.print(\u00abEscriba el m\u00f3dulo: \u00ab);<\/strong><\/li>\n<li><strong>modulo = entrada.nextInt();<\/strong><\/li>\n<\/ul>\n<p>Con un for generamos 20 n\u00fameros:<\/p>\n<ul>\n<li><strong>for (i=1; i&lt;=20; i++){<\/strong><\/li>\n<li><strong>numero = (cmultiplicativa*semilla) % modulo;\u00a0 <\/strong>Operaci\u00f3n de la f\u00f3rmula<\/li>\n<li><strong>numero2 = (double)numero \/ (double)(modulo-1);\u00a0 <\/strong>Operaci\u00f3n para obtener el valor en el rango de 0 a 1<\/li>\n<li><strong>System.out.printf(\u00ab%d. %d (%.4f)\\n\u00bb, i ,numero ,numero2 ); <\/strong>Impresi\u00f3n del resultado<\/li>\n<li><strong>semilla = numero;\u00a0 <\/strong>Se utilizar\u00e1 el n\u00famero entero obtenido como semilla de la siguiente operaci\u00f3n.<\/li>\n<\/ul>\n<h2>Prueba<\/h2>\n<p><em>Se desean obtener 16 n\u00fameros pseudo aleatorios usando el algoritmo congruencia multiplicativo:<\/em><\/p>\n<p>Para obtener 16 se necesita que m= 64 pues el per\u00edodo de vida m\u00e1ximo = m\/4 o 64\/4=16. Es decir, g=6 pues <span class=\"wp-katex-eq\" data-display=\"false\">2^6 = 64 <\/span>, y el periodo de vida es de <span class=\"wp-katex-eq\" data-display=\"false\">2^{6-2} = 2^4 = 16<\/span><\/p>\n<p><span class=\"wp-katex-eq\" data-display=\"false\">X_0<\/span> debe ser impar, por lo que seleccionamos 15<\/p>\n<p>K = 4 por lo que a= 3+8(4) = 35<\/p>\n<div id=\"attachment_1211\" style=\"width: 366px\" class=\"wp-caption alignnone\"><a href=\"http:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2017\/09\/algoritmo-congruencial-multiplicativo-java.gif\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-1211\" class=\"size-full wp-image-1211\" src=\"http:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2017\/09\/algoritmo-congruencial-multiplicativo-java.gif\" alt=\"Algoritmo congruencial multiplicativo ejecutandose en Java\" width=\"356\" height=\"426\" \/><\/a><p id=\"caption-attachment-1211\" class=\"wp-caption-text\">Algoritmo congruencial multiplicativo ejecut\u00e1ndose en Java<\/p><\/div>\n<p>&nbsp;<\/p>\n<p>Por lo que se puede observar, se logran los 16 n\u00fameros, a partir del n\u00famero 17 se comienzan a repetir.<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<h3>Bibliograf\u00eda<\/h3>\n<ol>\n<li><strong>Garc\u00eda, Garc\u00eda y C\u00e1rdenas (2006).<\/strong> <a href=\"https:\/\/books.google.com.mx\/books?id=VuEfwtFr1QMC&amp;printsec=frontcover&amp;dq=simulacion+promodel&amp;hl=es-419&amp;sa=X&amp;redir_esc=y#v=onepage&amp;q=simulacion%20promodel&amp;f=false\">Simulaci\u00f3n y an\u00e1lisis de sistemas con Promodel<\/a>. Ed. Pearson.<\/li>\n<li><strong>S\u00e1nchez-Pajares y\u00a0 Bravo (2002)<\/strong>. Una funci\u00f3n random poco aleatoria.\u00a0<i>Revista espa\u00f1ola de f\u00edsica<\/i>,\u00a0<i>16<\/i>(2), 60-62. Disponible en: [<a href=\"https:\/\/www.eweb.unex.es\/eweb\/fisteor\/santos\/PUBLICATIONS\/a02YusSan-PajREFv16n2p60.pdf\">https:\/\/www.eweb.unex.es\/eweb\/fisteor\/santos\/PUBLICATIONS\/a02YusSan-PajREFv16n2p60.pdf<\/a>]<\/li>\n<\/ol>\n","protected":false},"excerpt":{"rendered":"<p>El algoritmo congruencial multiplicativo se utiliza para generar n\u00fameros pseudo aleatorios. Veamos a continuaci\u00f3n una explicaci\u00f3n de en qu\u00e9 consiste as\u00ed como su implementaci\u00f3n en Java.<\/p>\n","protected":false},"author":1,"featured_media":1214,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"amp_status":"","footnotes":""},"categories":[216],"tags":[97,213,53],"class_list":["post-1198","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-simulacion-ciencias","tag-ejercicios-java","tag-numeros-pseudo-aleatorios","tag-simulacion"],"_links":{"self":[{"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/posts\/1198","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/comments?post=1198"}],"version-history":[{"count":19,"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/posts\/1198\/revisions"}],"predecessor-version":[{"id":1435,"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/posts\/1198\/revisions\/1435"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/media\/1214"}],"wp:attachment":[{"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/media?parent=1198"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/categories?post=1198"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/tags?post=1198"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}