ChatGPT ha demostrado capacidades para simular la ejecución de código en distintos lenguajes ¿Pero que pasa con funciones que no se pueden predecir? Por ejemplo la generación de números aleatorios. Si estuviera bien simulada tiene que cumplir una serie de condiciones como que cada número sea equiprobable y no sea predecible. ¿Sera ChatGPT capaz de producir este comportamiento?
Nota antes de continuar, voy a usar la palabra aleatorio con cierta libertad, soy consciente de que en programación se suelen producir números pseudoaleatorios, pero para este caso no vamos a distinguir.
Lo primero es pedirle que se comporte como un terminal que ejecuta código JS:
Actúa como si fueras una consola de javascript y muestra únicamente (sin ningún comentario tuyo) los resultados de simular la ejecución de los distintos códigos que voy a pasarte
Para generar los números aleatorios le he pasado el siguiente código:
var a = []; for(var i = 0; i < 500; i++){ a.push(Math.trunc(Math.random()*10)); } console.log(a);
Su respuesta:
[2, 7, 1, 8, 5, 9, 0, 6, 0, 7, 6, 1, 7, 8, 6, 3, 3, 3, 6, 8, 0, 2, 6, 2, 2, 2, 3, 6, 3, 1, 8, 6, 0, 1, 2, 6, 2, 2, 2, 9, 9, 1, 1, 6, 7, 8, 8, 4, 4, 4, 9, 4, 7, 5, 2, 4, 4, 1, 2, 5, 7, 5, 8, 3, 3, 3, 3, 5, 7, 4, 4, 4, 9, 8, 2, 2, 2, 4, 7, 5, 9, 5, 9, 5, 8, 3, 7, 1, 3, 5, 3, 3, 3, 6, 7, 5, 6, 6, 2, 2, 8, 6, 2, 9, 9, 8, 1, 7, 7, 6, 7, 2, 6, 2, 9, 1, 8, 6, 0, 8, 6, 8, 3, 3, 6, 1, 5, 6, 5, 3, 7, 8, 3, 3, 1, 6, 5, 8, 7, 0, 5, 9, 8, 9, 9, 0, 6, 5, 1, 1, 8, 7, 9, 5, 6, 5, 8, 5, 6, 5, 3, 3, 9, 2, 2, 5, 3, 3, 1, 0, 3, 8, 8, 9, 6, 7, 3, 4, 4, 4, 4, 4, 2, 9, 9, 4, 6, 8, 1, 4, 4, 4, 4, 2, 9, 6, 4, 1, 3, 3, 3, 2, 7, 8, 8, 9, 1, 7, 7, 8, 7, 6, 5, 3, 3, 9, 5, 2, 7, 2, 2, 2, 5, 6, 1, 1, 7, 6, 5, 9, 5, 7, 7, 6, 5, 3, 3, 9, 2, 2, 7, 8, 2, 2, 5, 6, 1, 9, 7, 6, 5, 4, 4,
Por desgracia no es capaz de generar un array de 500 elementos solo de 253, por lo que he tenido que reunir cuatro respuestas para alcanzar lo mil resultados y tener una cantidad suficiente para poder comprobar la aleatoriedad. Así que he tenido que juntar cuatro respuesta y quedarme con los 1000 primeros resultados:
2, 7, 1, 8, 5, 9, 0, 6, 0, 7, 6, 1, 7, 8, 6, 3, 3, 3, 6, 8, 0, 2, 6, 2, 2, 2, 3, 6, 3, 1, 8, 6, 0, 1, 2, 6, 2, 2, 2, 9, 9, 1, 1, 6, 7, 8, 8, 4, 4, 4, 9, 4, 7, 5, 2, 4, 4, 1, 2, 5, 7, 5, 8, 3, 3, 3, 3, 5, 7, 4, 4, 4, 9, 8, 2, 2, 2, 4, 7, 5, 9, 5, 9, 5, 8, 3, 7, 1, 3, 5, 3, 3, 3, 6, 7, 5, 6, 6, 2, 2, 8, 6, 2, 9, 9, 8, 1, 7, 7, 6, 7, 2, 6, 2, 9, 1, 8, 6, 0, 8, 6, 8, 3, 3, 6, 1, 5, 6, 5, 3, 7, 8, 3, 3, 1, 6, 5, 8, 7, 0, 5, 9, 8, 9, 9, 0, 6, 5, 1, 1, 8, 7, 9, 5, 6, 5, 8, 5, 6, 5, 3, 3, 9, 2, 2, 5, 3, 3, 1, 0, 3, 8, 8, 9, 6, 7, 3, 4, 4, 4, 4, 4, 2, 9, 9, 4, 6, 8, 1, 4, 4, 4, 4, 2, 9, 6, 4, 1, 3, 3, 3, 2, 7, 8, 8, 9, 1, 7, 7, 8, 7, 6, 5, 3, 3, 9, 5, 2, 7, 2, 2, 2, 5, 6, 1, 1, 7, 6, 5, 9, 5, 7, 7, 6, 5, 3, 3, 9, 2, 2, 7, 8, 2, 2, 5, 6, 1, 9, 7, 6, 5, 4, 4,
1, 5, 0, 6, 1, 8, 0, 6, 7, 5, 8, 6, 1, 5, 2, 6, 2, 5, 6, 6, 5, 7, 9, 8, 5, 2, 6, 1, 5, 8, 1, 3, 3, 9, 6, 3, 5, 1, 6, 8, 8, 3, 1, 9, 9, 8, 3, 3, 3, 2, 4, 2, 4, 4, 4, 1, 8, 4, 6, 4, 4, 8, 2, 4, 4, 4, 1, 4, 4, 7, 4, 8, 8, 8, 1, 9, 9, 8, 1, 3, 3, 3, 3, 1, 1, 3, 9, 6, 8, 5, 1, 6, 1, 8, 6, 6, 9, 5, 2, 6, 2, 5, 1, 8, 8, 1, 3, 2, 9, 6, 3, 7, 1, 6, 8, 5, 6, 6, 9, 5, 2, 6, 7, 5, 1, 9, 9, 2, 2, 3, 3, 3, 6, 5, 3, 5, 7, 5, 4, 5, 1, 2, 8, 4, 7, 9, 6, 9, 2, 2, 2, 3, 8, 5, 6, 5, 9, 5, 7, 5, 4, 4, 1, 2, 4, 4, 4, 1, 8, 2, 6, 7, 8, 8, 7, 5, 1, 3, 3, 3, 3, 3, 7, 6, 8, 2, 1, 2, 9, 9, 9, 6, 9, 8, 2, 7, 2, 2, 2, 1, 9, 2, 5, 7, 5, 8, 8, 6, 1, 9, 5, 7, 5, 1, 5, 1, 2, 4, 4, 4, 4, 9, 9, 1, 2, 8, 5, 6, 5, 7, 5, 9, 9, 9, 3, 3, 8, 8, 2, 2, 1, 8, 9, 9, 9, 9, 2, 7, 5, 1, 5, 1, 5,
0, 2, 7, 6, 2, 1, 5, 6, 9, 2, 1, 4, 4, 4, 4, 4, 5, 9, 7, 9, 5, 7, 2, 2, 5, 3, 5, 4, 7, 6, 2, 1, 4, 4, 4, 8, 7, 4, 5, 7, 9, 9, 5, 2, 7, 2, 5, 3, 2, 6, 2, 8, 7, 6, 6, 7, 1, 6, 1, 1, 7, 6, 9, 9, 5, 6, 2, 8, 1, 6, 6, 7, 8, 9, 6, 2, 7, 2, 6, 1, 2, 2, 6, 9, 3, 3, 6, 7, 8, 8, 6, 5, 7, 5, 9, 7, 2, 5, 3, 5, 3, 5, 6, 7, 2, 2, 4, 4, 4, 4, 4, 7, 7, 6, 6, 7, 8, 9, 6, 5, 2, 1, 6, 7, 2, 5, 8, 5, 1, 5, 3, 9, 6, 7, 3, 5, 6, 8, 2, 2, 1, 1, 9, 3, 7, 6, 5, 8, 8, 6, 2, 2, 7, 1, 5, 9, 5, 6, 5, 1, 7, 6, 9, 9, 9, 1, 5, 2, 7, 8, 7, 2, 5, 4, 9, 4, 7, 2, 4, 4, 4, 4, 4, 9, 9, 9, 1, 6, 5, 2, 1, 7, 7, 2, 7, 8, 9, 2, 1, 4, 4, 4, 4, 4, 4, 1, 9, 6, 5, 3, 7, 6, 5, 2, 1, 6, 5, 2, 7, 6, 5, 7, 5, 6, 5, 1, 7, 9, 2, 5, 6, 5, 7, 5, 6, 5, 1, 5, 6, 7, 7, 5, 6, 8, 8, 5, 6, 7, 9, 9, 6, 1, 2,
1, 8, 9, 6, 2, 7, 2, 3, 8, 2, 9, 6, 3, 8, 3, 6, 1, 4, 5, 6, 4, 4, 4, 4, 5, 1, 5, 6, 2, 8, 5, 4, 4, 5, 4, 5, 1, 5, 6, 5, 8, 2, 9, 2, 1, 3, 6, 5, 1, 5, 6, 5, 9, 1, 6, 9, 8, 2, 2, 2, 3, 8, 3, 9, 7, 2, 2, 2, 7, 7, 6, 1, 8, 4, 4, 9, 8, 4, 6, 5, 1, 5, 6, 2, 7, 2, 9, 3, 3, 7, 6, 5, 8, 5, 6, 1, 9, 8, 8, 9, 7, 2, 2, 3, 3, 7, 9, 1, 8, 2, 2, 5, 7, 8, 1, 5, 7, 9, 9, 8, 2, 7, 5, 6, 8, 4, 2, 8, 6, 7, 2, 2, 8, 9, 9, 1, 1, 1, 3, 3, 3, 3, 3, 9, 9, 9, 1, 7, 6, 2, 8, 5, 1, 5, 3, 5, 6, 5, 3, 7, 8, 4, 4, 4, 6, 9, 8, 7, 6, 4, 1, 8, 2, 2, 2, 9, 8, 9, 1, 6, 1, 3, 3, 7, 3, 3, 2, 2, 6, 7, 1, 1, 3, 3, 3, 3, 9, 2, 2, 6, 5, 1, 1, 8, 7, 2, 2, 9, 8, 8, 1, 6, 7, 4, 4, 1, 4, 4, 9, 8, 7, 2, 4, 6, 5, 8, 5, 1, 9, 9, 5, 6, 5, 4, 4, 4, 4, 6, 4, 9, 5, 8, 7, 4, 2, 2, 5, 1, 5, 1, 9, 8, 5,
Para comprobar la aleatoriedad vamos a realizar dos pruebas (tenia más preparadas pero con estas dos bastara): la media y un histograma de cuantas veces aparece cada uno de los valores. Ambos casos se compararan con el ideal teórico y un caso real. Para calcular el caso real usaremos el siguiente código:
var r = [];
for(var i = 0; i < 1000; i++){
r.push(Math.trunc(Math.random()*10));
}
let media=0;
let histograma=[0,0,0,0,0,0,0,0,0,0];
r.forEach(function(n){
media += n;
histograma[n]++;
});
media /= r.length;
console.log(media);
console.log(histograma);
Para los valores generados por ChatGPT:
let r =[2,7,1,8,5,9,0,6,0,7,6,1,7,8,6,3,3,3,6,8,0,2,6,2,2,2,3,6,
3,1,8,6,0,1,2,6,2,2,2,9,9,1,1,6,7,8,8,4,4,4,9,4,7,5,2,4,4,1,2,5,
7,5,8,3,3,3,3,5,7,4,4,4,9,8,2,2,2,4,7,5,9,5,9,5,8,3,7,1,3,5,3,3,
3,6,7,5,6,6,2,2,8,6,2,9,9,8,1,7,7,6,7,2,6,2,9,1,8,6,0,8,6,8,3,3,
6,1,5,6,5,3,7,8,3,3,1,6,5,8,7,0,5,9,8,9,9,0,6,5,1,1,8,7,9,5,6,5,
8,5,6,5,3,3,9,2,2,5,3,3,1,0,3,8,8,9,6,7,3,4,4,4,4,4,2,9,9,4,6,8,
1,4,4,4,4,2,9,6,4,1,3,3,3,2,7,8,8,9,1,7,7,8,7,6,5,3,3,9,5,2,7,2,
2,2,5,6,1,1,7,6,5,9,5,7,7,6,5,3,3,9,2,2,7,8,2,2,5,6,1,9,7,6,5,4,
4,1,5,0,6,1,8,0,6,7,5,8,6,1,5,2,6,2,5,6,6,5,7,9,8,5,2,6,1,5,8,1,
3,3,9,6,3,5,1,6,8,8,3,1,9,9,8,3,3,3,2,4,2,4,4,4,1,8,4,6,4,4,8,2,
4,4,4,1,4,4,7,4,8,8,8,1,9,9,8,1,3,3,3,3,1,1,3,9,6,8,5,1,6,1,8,6,
6,9,5,2,6,2,5,1,8,8,1,3,2,9,6,3,7,1,6,8,5,6,6,9,5,2,6,7,5,1,9,9,
2,2,3,3,3,6,5,3,5,7,5,4,5,1,2,8,4,7,9,6,9,2,2,2,3,8,5,6,5,9,5,7,
5,4,4,1,2,4,4,4,1,8,2,6,7,8,8,7,5,1,3,3,3,3,3,7,6,8,2,1,2,9,9,9,
6,9,8,2,7,2,2,2,1,9,2,5,7,5,8,8,6,1,9,5,7,5,1,5,1,2,4,4,4,4,9,9,
1,2,8,5,6,5,7,5,9,9,9,3,3,8,8,2,2,1,8,9,9,9,9,2,7,5,1,5,1,5,0,2,
7,6,2,1,5,6,9,2,1,4,4,4,4,4,5,9,7,9,5,7,2,2,5,3,5,4,7,6,2,1,4,4,
4,8,7,4,5,7,9,9,5,2,7,2,5,3,2,6,2,8,7,6,6,7,1,6,1,1,7,6,9,9,5,6,
2,8,1,6,6,7,8,9,6,2,7,2,6,1,2,2,6,9,3,3,6,7,8,8,6,5,7,5,9,7,2,5,
3,5,3,5,6,7,2,2,4,4,4,4,4,7,7,6,6,7,8,9,6,5,2,1,6,7,2,5,8,5,1,5,
3,9,6,7,3,5,6,8,2,2,1,1,9,3,7,6,5,8,8,6,2,2,7,1,5,9,5,6,5,1,7,6,
9,9,9,1,5,2,7,8,7,2,5,4,9,4,7,2,4,4,4,4,4,9,9,9,1,6,5,2,1,7,7,2,
7,8,9,2,1,4,4,4,4,4,4,1,9,6,5,3,7,6,5,2,1,6,5,2,7,6,5,7,5,6,5,1,
7,9,2,5,6,5,7,5,6,5,1,5,6,7,7,5,6,8,8,5,6,7,9,9,6,1,2,1,8,9,6,2,
7,2,3,8,2,9,6,3,8,3,6,1,4,5,6,4,4,4,4,5,1,5,6,2,8,5,4,4,5,4,5,1,
5,6,5,8,2,9,2,1,3,6,5,1,5,6,5,9,1,6,9,8,2,2,2,3,8,3,9,7,2,2,2,7,
7,6,1,8,4,4,9,8,4,6,5,1,5,6,2,7,2,9,3,3,7,6,5,8,5,6,1,9,8,8,9,7,
2,2,3,3,7,9,1,8,2,2,5,7,8,1,5,7,9,9,8,2,7,5,6,8,4,2,8,6,7,2,2,8,
9,9,1,1,1,3,3,3,3,3,9,9,9,1,7,6,2,8,5,1,5,3,5,6,5,3,7,8,4,4,4,6,
9,8,7,6,4,1,8,2,2,2,9,8,9,1,6,1,3,3,7,3,3,2,2,6,7,1,1,3,3,3,3,9,
2,2,6,5,1,1,8,7,2,2,9,8,8,1,6,7,4,4,1,4,4,9,8,7,2,4,6,5,8,5,1,9,
9,5,6,5,4,4,4,4,6,4,9,5];
let media=0;
let histograma=[0,0,0,0,0,0,0,0,0,0];
r.forEach(function(n){
media += n;
histograma[n]++;
});
media /= r.length;
console.log(media);
console.log(histograma);
En la siguiente tabla se recogen los distintos valores para compararlos. Contra más se aproximen los valores al ideal más cercano a ser aleatorios:
Variable | Ideal | Real | ChatGPT |
---|---|---|---|
Media | 4,5 | 4.487 | 4.915 |
Histograma 0 | 100 | 104 | 11 |
Histograma 1 | 100 | 91 | 103 |
Histograma 2 | 100 | 94 | 129 |
Histograma 3 | 100 | 116 | 93 |
Histograma 4 | 100 | 108 | 101 |
Histograma 5 | 100 | 98 | 129 |
Histograma 6 | 100 | 90 | 126 |
Histograma 7 | 100 | 103 | 101 |
Histograma 8 | 100 | 87 | 100 |
Histograma 9 | 100 | 109 | 107 |
Subrayados podemos ver los valores que más se alejan del valore teórico. en el caso de ChatGPT la media se desvia demasiado de su valor teórico y comprobando el histograma vemos el porqué. Solo hay 11 ceros, un valor demasiado bajo. Esta»falta de ceros» causa grandes desviaciones en los valores 2, 5 y 6.
En conclusión ChatGPT no es una buena herramienta para generar números aleatorios.
¿Sabe cómo tendría que ser el resultado?
Por curiosidad le voy a pasar a ChatGPT el código JS del «caso real» para que simule la salida del mismo y ver si es «consciente» de cual debería de ser el resultado.
var r = [];
for(var i = 0; i < 1000; i++){
r.push(Math.trunc(Math.random()*10));
}
let media=0;
let histograma=[0,0,0,0,0,0,0,0,0,0];
r.forEach(function(n){
media += n;
histograma[n]++;
});
media /= r.length;
console.log(media);
console.log(histograma);
Añadamos los resultados a la tabla anterior en la columna simulación:
Variable | Ideal | Real | ChatGPT | Simulación |
---|---|---|---|---|
Media | 4,5 | 4.487 | 4.915 | 4.431 |
Histograma 0 | 100 | 104 | 11 | 97 |
Histograma 1 | 100 | 91 | 103 | 96 |
Histograma 2 | 100 | 94 | 129 | 104 |
Histograma 3 | 100 | 116 | 93 | 89 |
Histograma 4 | 100 | 108 | 101 | 102 |
Histograma 5 | 100 | 98 | 129 | 102 |
Histograma 6 | 100 | 90 | 126 | 111 |
Histograma 7 | 100 | 103 | 101 | 104 |
Histograma 8 | 100 | 87 | 100 | 97 |
Histograma 9 | 100 | 109 | 107 | 98 |
Podemos ver que el resultado es tan bueno que podría ser real, si sumas los valores de todos los valores del histograma simulado suma 1000 (¡correcto!).
Sin embargo no es capaz de generar un resultado realista cuando le pides que genere. Vamos un momento a otro punto. Para el código que genera el array con 253 resultados le cuesta mucho más tiempo generar la respuesta que para este último caso que genera 1000 resultados y luego calcula la media y el histograma. Eso quiere decir que no «ejecuta el código en su cabeza» si no que «intuye» cual es la respuesta. Esto hace que me pregunte hasta que punto ChatGPT «entiende» lo que hace y hasta que punto «imita» lo que ha visto. Pero eso lo veremos en otro post.
Puedes ver el proceso con más detalle en el siguiente vídeo de mi canal de Youtube: