Archivo para marzo de 2012

Ignorancia y felicidad

¿La ignorancia da la felicidad? La realidad es muy distinta y mucho menos alentadora: la ignorancia tan solo nos hace lo suficientemente estúpidos como para no poder ver lo infelices que realmente somos.

Milhaud, en un artículo resumen de Ferenheit 451, de Ray Bradbury.

El respeto hay que ganarlo

En realidad yo no respeto ninguna práctica religiosa, las puedo tolerar por convivencia, pero el respeto hay que ganarlo.

@laquintacolumna

Las dos premisas del divulgador científico

  1. Cualquier cosa que afirme acerca de su trabajo o del de otros debe ser argumentada con criterios científicos sólidos y serios.
  2. No puede dejarse arrastrar por la crispación, la sinrazón e incluso el insulto personal con el que a veces se encuentra y debe siempre transmitir la ciencia de forma correcta y elegante, lo que no es incompatible con la contundencia de sus exposiciones e incluso con la más fina de las ironías.

José Manuel López Nicolás, autor del blog Scientia.

Hacer copia de seguridad de tus tweets

Twitter es ese sistema de microblogging que ahora es tan famoso, pero no por lo que puedas escribir, sino por lo que te puedan contestar. De ahí lo de red social.

Uno de los problemas carencias de este servicio, aunque creo que hay más, es que no queda constancia de lo que escribes más allá de sus servidores y ¿qué pasa si quieres hacer copia de seguridad?

Pues tienes dos opciones: o usar una de las múltiples aplicaciones que hay para ello (una búsqueda en Internet dará con muchas de ellas aunque, eso sí, la mayoría tienen características de pago) o usar las aplicaciones necesarias para descargarlos por ti mismo. Más concretamente, usar cURL.

Antes de nada, debes tener en cuenta que, como máximo, sólo se pueden recuperar los últimos 3200 tweets. Esto es debido a una restricción en el API de Twitter. ¿Por qué? Ni idea, pero ahí está.

Y luego hay que tener en cuenta que sólo se pueden recuperar 100 tweets en cada petición, por lo que se harán 32 peticiones. Después de esto y de revisar un poco su API, ya podemos recuperar nuestros 3200 últimos tweets mediante este comando (que se puede ejecutar en Linux o Windows siempre que se use la aplicación cURL):

$ curl -s --user-agent "Mozilla" --insecure "https://twitter.com/statuses/user_timeline/beoxman.xml?count=100&page=[1-32]" > beoxman@twitter.com.2012-03-20.xml

Obviamente hay que sustituir el nombre de usuario (beoxman en este caso) por el vuestro. Después de esto, tendréis en el archivo de salida vuestros últimos 3200 tweets en formato XML.

El siguiente paso es buscar la forma de descargarse, también en formato XML, todos los retweets que hemos hecho (que no están incluidos en el TL) y luego, ya para rematar, descargar todas las menciones y retweets que nos han hecho. Pero bueno, eso ya lo preparamos para otro día después de revisar el API de descargas :) .

Brujería

La brujería es la salsa que los idiotas vierten sobre el fracaso para ocultar el sabor de la incompetencia.

Tyrion Lannister, personaje fantástico de la serie de novelas Canción de hielo y fuego escritas por George R. R. Martin.

Cabreo

El cabreo que provocamos en las personas cuando nos reímos de sus creencias es directamente proporcional al tamaño del disparate que sean las mismas. Es decir, que si nos reímos de que no crea que la capital de Francia es París, ese uno no se mosqueará nada porque esa creencia no es ningún disparate. Pero si nos reímos de uno que crea en los marcianos ya empiezan las malas caras. Finalmente, si nos reímos de algunas de esas colecciones de cuentos fantásticos que son las religiones, las repercusiones puede implicar ir a la cárcel, ser víctima de un atentado o, a poco que nos lo propongamos, iniciar una guerra.

Mauro Entrialgo, @Tyrexito, en un tuit.

Libros de «Casa del Libro»

Hoy han llegado los libros de Casa del Libro, pedidos el día 29 del mes pasado. El envío ha sido rápido, han llegado en dos días, el problema es que los han tenido que pedir a la editorial y por eso han tardado una semana.

Libros de Casa del Libro

El caso es que los pedí aquí, en España, en lugar de en Amazon porque aquí sí que tenían stock y que el precio era el mismo. Pero no se yo si habré acertado porque vienen bastante deteriorados. Sucios. En la foto no se aprecia, pero hay manchas de un mal almacenaje tanto en portada como en contraportada. Los cantos están rozados y tienen algunas —pequeñas, eso sí— dobleces. El interior está bien, así que supongo que estos desperfectos serán por el mal almacenaje.

Y estas son las cosas que hacen que te plantees si seguir comprando cosas en España o no :palm: .

P.D.: Por cierto, los libros son «¿Se creen que somos tontos? 100 formas de detectar las falacias de los políticos, los tertulianos y los medios de comunicación» y «El cerdo que quería ser jamón y otros 99 experimentos para filósofos de salón», ambos de Julian Baggini. Ahora, en cuanto tenga tiempo los leeré y ya pondré algún comentario.

Actualización 2012-03-09: Comenté esto mismo a través de Twitter y @casadellibrocom me respondió indicándome que me los cambiaban. Les dije que no hacía falta, que ahora que estaban aquí prefería leerlos a que volvieran a estar de viaje. Aún así, rápida y buena respuesta por parte de ellos.

Algoritmo de cálculo de la sucesión de Fibonacci en C++

Seguro que todos los que habéis tenido matemáticas en el instituto o universidad conocéis la sucesión de Fibonacci. Y seguro que todos los que habéis hecho algún curso, módulo o carrera de informática la habéis tenido que implementar alguna vez, ¿verdad?

Lo más fácil era seguir las instrucciones del profesor e implementar, sin salirse del guión, la definición matemática de esta sucesión:

f0 = 0
f1 = 1
fn = fn-1 + fn-2 para todo n = 2, 3, 4…

Siguiendo esto estrictamente, en C++ os quedaría:


unsigned long long
fibonacci(int value) {
  if(value == 0) {
    return 0;
  } else if(value == 1) {
    return 1;
  } else {
    return fibonacci(value - 1) + fibonacci(value - 2);
  }
}

Este algoritmo, como podréis observar, es recursivo, es decir, se llama a sí mismo con parámetros diferentes a los que se pasa inicialmente para calcular la solución.

Pero este algoritmo tiene un problema bastante más grave que el de la recursividad (que, dependiendo del número de llamadas recursivas, corremos el riesgo de desbordar la pila) y es el de la duplicidad de llamadas a la función con el mismo valor del parámetro. Es decir, ¿te has parado a pensar cuántas veces se llama a la función fibonacci(int) con el mismo parámetro? Pues te lo digo yo: para un valor inicial de 8, esta función se llama 13 veces con el 0, 21 veces con el 1, 13 veces con el 2, 8 veces con el 3, 5 veces con el 4, 3 veces con el 5, 2 veces con el 6 y 1 vez con el 7. En total 66 veces. 66 veces cuando el valor a calcular es 8. Si tenemos que calcular con el 20, la función se llama un total de ¡21 890 veces!

Digamos que esta función, implementada directamente como se define matemáticamente, es totalmente ineficiente. Probad, si queréis, a calcular el tiempo de cálculo para 20, 40, 50… si tenéis tiempo, claro.

¿Y cómo solucionarlo? Pues mediante programación dinámica. Resumiendo, se trata de reducir el problema principal en problemas más pequeños, calcular la solución para cada problema pequeño y, finalmente, aplicar las soluciones de estos problemas pequeños para solucionar el problema grande.

Para la sucesión de Fibonacci específicamente, de lo que se trata es de no tener que calcular el mismo valor cada vez que se llama a la función, sino de tener una tabla donde están los valores previamente calculados. Si, cuando se llama a esta función el valor no está calculado, se calcula, pero si lo está, se recoge directamente de la tabla evitando toda esa recursividad y cálculos innecesarios.

Una posible implementación en C++ podría quedar así:


unsigned long long
fibonacci_alt(int value) {
	// Variables estáticas con la tabla de valores precalculados.
	static unsigned long long* prev_values = new unsigned long long[value];
	static bool init = true;
	if(init) {
		// Inicializamos sólo una vez.
		for(int i = 0; i < value; i++) {
			prev_values[i] = -1;
		}
		init = false;
	}
	
	// Implementación de Fibonacci comprobando si hay algún valor precalculado.
	if(value == 0) {
		return 0;
	} else if(value == 1) {
		return 1;
	} else if(prev_values[value - 1] != -1 || prev_values[value - 2] != -1) {
		prev_values[value] = prev_values[value - 1] + prev_values[value - 2];
		return prev_values[value];
	} else {
		if(prev_values[value-1] == -1) {
			prev_values[value-1] = fibonacci_alt(value-1);
		}
		if(prev_values[value-2] == -1) {
			prev_values[value-2] = fibonacci_alt(value-2);
		}
		prev_values[value] = prev_values[value-1] + prev_values[value-2];
		return prev_values[value];
	}
}

Usando esta función, ésta sólo se ejecuta el número de veces indicado en el valor. Cierto es que usa más memoria, pero la reducción de tiempo es tan impresionante que merece la pena. De hecho, con este algoritmo, podréis calcular sin problemas la sucesión de Fibonacci para valores mayores de 200. Probad con el algoritmo anterior…

Y, ya de estar, aquí tenéis un programa para probar estos dos algoritmos con alguna funcionalidad extra, como la de la presentación de estadísticas de llamadas a las funciones y demás. Y con un fallo: con el argumento “2” produce una violación de segmento. Pero en general funciona.

Para compilarlo podéis usar el comando:

$ g++ -o fibonacci fibonacci.cpp

Y para usarlo podéis hacerlo así (o usando el comando time para calcular cuánto tarda con cada método):

$ ./fibonacci
fibonacci <number> [-a|-v|-av]
Opciones:
  -a   Usa el algoritmo alternativo.
  -v   Muestra más información en pantalla.
  -av  Usa el algoritmo alternativo mostrando más información.
$ ./fibonacci 20
6765
$

Funciones de comprobación de tipos de datos en C++

Haciendo uso de la STL de C++ y viendo que no tiene ninguna función “sencilla” de comprobación de tipos de datos, he implementado estas funciones para uso y disfrute de todo aquel que las quiera y las necesite. Con sus comentarios y todo.

Por resumir, tenemos la función T StringTo<T>(string,T) (con sus diferentes variantes) para convertir una cadena al tipo determinado en la plantilla. Por ejemplo:


int i = StringTo<int>("42",0);  // i valdrá 42

bool error;
int a = StringTo<int>("42a",-1,error);  // a valdrá -1 y error será true

float f = StringTo<float>("123.45",-1);  // f valdrá 123.45

También está la función bool StringIs<T>(string) (también con sus variantes sobrecargadas) que comprueba si el valor pasado en la cadena como parámetro es del tipo indicado en la plantilla:


cout << boolalpha << StringIs<int>("42") << endl;  // la salida será true
cout << boolalpha << StringIs<int>("42a") << endl;  // la salida será false
cout << boolalpha << StringIs<float>("42") << endl;  // la salida será true
cout << boolalpha << StringIs<float>("123.45") << endl;  // la salida será true

Finalmente tenemos la función string StringFrom<T>(T) que devuelve una cadena con el valor pasado como parámetro convertido:


string value = StringFrom<int>(42);  // "value" contendrá la cadena "42"
string bvalue = StringFrom<bool>(true,boolapha);  // "bvalue" contendrá la cadena "true"

Y, ahora ya sí, la implementación:


#include <string>
#include <sstream>

using std::string;
using std::ios_base;
using std::stringstream;

/**
 * Convierte una cadena en el tipo dado en la plantilla.
 *
 * @param string value Valor a convertir.
 * @param T defaultValue Valor por defecto en caso de error.
 * @param bool& error Esta variable se fija a true si hay error, a false si
 * todo_ está correcto.
 * @param ios_base f Si son números, se puede especificar una base de
 * conversión.
 * @return T Valor devuelto según la cadena pasada.
 */
template <typename T>
T
StringTo(const string value, T defaultValue, bool& error, ios_base& (*f)(ios_base&) = NULL) {
	stringstream iss(value);
	T result;
	if(f == NULL) {
		iss >> result;
	} else {
		iss >> f >> result;
	}
	error = iss.fail() || iss.rdbuf()->in_avail() > 0;
	return (iss.fail() || iss.rdbuf()->in_avail() > 0 ? defaultValue : result);
}

/**
 * Función sobrecargada de la anterior donde se omite el parámetro "error".
 * @see template <typename T> T StringTo(const string, T, bool&, ios_base& (*)(ios_base&));
 */
template <typename T>
T
StringTo(const string value, T defaultValue, ios_base& (*f)(ios_base&) = NULL) {
	bool result;
	return StringTo<T>(value, defaultValue, result, f);
}

/**
 * Función sobrecargada de la anterior con un "const char*" en lugar de
 * un string.
 *
 * @param const char* value Valor a convertir.
 * @param T defaultValue Valor por defecto.
 * @param ios_base& f En caso de que sea un número y haya una base de
 * conversión.
 * @return T Tipo de dato a partir de la cadena.
 */
template <typename T>
T
StringTo(const char* value, T defaultValue, ios_base& (*f)(ios_base&) = NULL) {
	return StringTo<T>(string(value),defaultValue,f);
}

/**
 * Devuelve si una cadena contiene el tipo de dato indicado en la plantilla.
 *
 * @param string value Valor a controlar.
 * @param ios_base& f En caso de que sea un número, la base de conversión.
 * @return bool True si la cadena es del tipo indicado, false en otro caso.
 */
template <typename T>
bool
StringIs(const string value, ios_base& (*f)(ios_base&) = NULL) {
	stringstream iss(value);
	T result;
	if(f == NULL) {
		iss >> result;
	} else {
		iss >> f >> result;
	}
	return !iss.fail() && iss.rdbuf()->in_avail() <= 0;
}

/**
 * Convierte un valor del tipo indicado en la plantilla a cadena de caracters.
 *
 * @param T value Valor.
 * @param ios_base& f En caso de que sea numérico se puede especificar la base
 * de conversión.
 * @return string Cadena con el valor convertido.
 */
template <typename T>
string
StringFrom(const T value, ios_base& (*f)(ios_base&) = NULL) {
	stringstream result;
	if(f != NULL) {
		result << f;
	}
	result << (T)value;
	return result.str();
}

Actualización 2012-03-07: Releyendo un poco el código y habiendo leído algo de documentación adicional, creo que quedaría más elegante si llamamos a las funciones de otra manera (con la misma implementación), por eso de simplificar. Más o menos así:


namespace string {

template <typename T> T to(const string) {…}

template <typename T> T is(const string) {…}

template <typename T> const string from(T value) {…}

}

Con lo que los ejemplos quedarían:


int i = string::to<int>("42");  // 42
bool isint = string::is<int>("42");  // true
string value = string::from<float>(123.45);  // "123.45"

Por simple elegancia :grin: , ya que la funcionalidad es la misma. Pues quizás lo implemente…

Con derecho a roce

Carátula de 'Con derecho a roce'

Con derecho a roce es una película de 2011 protagonizada por Justin Timberlake y Mila Kunis y dirigida por Will Gluck.

El argumento trata de una cazatalentos que tiene que convencer al protagonista para que se cambie de trabajo. Para convencerlo lo lleva por Manhattan teniendo una divertida noche formando una pequeña amistad. Esa amistad va creciendo y ambos confiesan que no quieren relaciones serias porque son un estorbo y no conducen a nada, pero… ¿qué hay del sexo? Y hasta aquí puedo leer; seguro que el resto os lo imagináis vosotros.

El caso es que para ser una comedia romántica (no soy muy fan de este género) no está mal, aunque como suelo decir, para ser comedia dura bastante: una hora y cuarenta y nueve minutos.

Y no está mal, porque durante la película lo que predomina es la comedia, siendo el final lo empalagoso, aunque soportable si lo tuyo es sólo la comedia.

En resumen, te ríes bastante porque tiene unos cuantos puntos graciosos y el final también está bien. Así que, en mi escala MPSO le doy un 7.

El cambiazo

Carátula de 'El cambiazo'

El cambiazo es una película de 2011 protagonizada por Ryan Reynolds y Jason Bateman y dirigida por David Dobkin (el mismo director de Resacón en Las Vegas).

La historia cuenta que dos amigos están hartos de sus vidas con lo que, un día después de una fiesta, cada uno desea tener la vida del otro… y se cumple. A partir de ahí comienzan las situaciones cómicas de este tipo de películas (porque no ha sido la primera ni será la última de este género).

Pero la verdad es que se lleva bien; cierto es que en ciertos momentos se hace un poco cansada (me parece excesivo que una comedia dure una hora y cincuenta y dos minutos) pero el flujo de gags es constante y cuando te empiezas a aburrir llega ese momento que te hace soltar la carcajada. El mismo que se comenta finalizada la película y vuelve a saltar la carcajada.

En definitiva, en la escala MPSO le doy un 7, así que si tenéis dos horas sin nada que hacer y queréis pasar un rato agradable con risas aseguradas ponedla en vuestro reproductor.

El pensamiento crítico

Viendo que en Australia se preocupan porque los jóvenes empiecen a pensar de forma crítica e identificar errores conceptuales creando unos vídeos que explican, entre otras cosas, qué son las falacias lógicas, he decidido ponerlo aquí para darle más difusión, si cabe. Además, desde aquí voy a enlazar los vídeos con subtítulos traducidos por ffuentes. Y, ya, de paso, voy a pegar la transcripción hecha por este usuario.

Un argumento válido

El universo es un gran lugar. De hecho es enorme y más bien complicado. Desafortunadamente el cerebro humano es relativamente pequeño y simple, al menos en comparación. Para ayudarte a sobrevivir, tiene que trabajar duro para dar sentido a las cosas. El cerebro tiene herramientas inteligentes para ayudarte a lograrlo. Puede convertir experiencias en símbolos, recordar sensaciones, e identificar patrones.

Pero muchos trucos mentales exigen mucha energía, por ende tu cerebro busca atajos. Por ejemplo, buscará ideas y confirmaciones de lo que ya sospechas. Encontrará las ideas de gente en la que confías, más atractivas que las de aquellos en quienes no. Tomará tu propia experiencia y la tratará como evidencia. Difuminará las líneas entre lo que sientes ser el caso y lo que sabes que lo es. La mayor parte del tiempo estos trucos nos serán muy útiles, pero a veces nos engañan. Los mismos sesgos que pueden sernos muy útiles pueden engañarnos también. Y en un mundo de opiniones diversas, es dificil saber cuando pensar usando atajos y cuando poner algo de esfuerzo usando nuestra cabeza.

Sin embargo, pensar no tiene que ser siempre difícil, la lógica es una manera eficaz de identificar ideas que son más probables de ser útiles. La lógica es una manera de combinar ideas para llegar a una conclusión. Es como las matemáticas pero puede tratar con más que sólo números.

Probablemente la has usado ya. Piensa en la última discusión que tuviste. ¿Se pareció un poco a esto? Pero todos los demás tienen permiso para ir. ¿Por qué yo no puedo?

Un argumento lógico sería así: Todas las personas tienen permiso para ir, soy una persona. Por lo tanto, debería tener permiso para ir.

La lógica es una manera útil de combinar ideas establecidas para apoyar la aceptación de una nueva idea. Buscar lógica en una discusión puede ayudarte a decidir si deberías estar de acuerdo con alguien, o esperar más datos.

Lógica rota

Tal como las ecuaciones en matemáticas, la lógica tiene una estructura. Es algo parecido a: uno más dos es igual a tres. En una parte de la ecuación tenemos las cosas que ya sabemos o con las que estamos de acuerdo. Por otra parte está la respuesta verdadera, mientras que los números del otro lado no cambien.

En lógica, una idea es llamada premisa, la cual puede juntarse con otra premisa de tal manera que nos lleve a una conclusión. Una premisa puede decir que los imanes atraen el hierro, la otra puede decir, este objeto está hecho de hierro. Sin verlo puedes decir lógicamente que el imán va a atraer este objeto. ¿Pero y si movemos de lugar la información? Digamos que los imanes atraen el hierro y este objeto es atraido por imanes. ¿Puedes decir que este objeto está hecho de hierro? Desgraciadamente no.

Esto parece lógico, pero la conclusión ya no funciona. Los imanes no sólo atraen el hierro, sino otros metales también, como el níquel. Esta lógica rota es llamada “falacia lógica”. Este ejemplo en concreto es una falacia formal. Porque su forma parece igual a la lógica, pero es falsa. En Latín y en círculos legales esto es llamado un “non sequitur”, que significa “no se sigue”.

Es fácil confundir la falacia lógica con la verdad si no eres cuidadoso. La gente lo hace todo el tiempo. A veces por accidente y a veces para engañarte. Conocer la estructura de un argumento lógico es importante. No cometerías el error de pensar: Tres, más dos, es igual a uno. A fin de cuentas, las reglas son las reglas. Pero romper las reglas de la lógica puede hacer que una respuesta parezca correcta, cuando no lo es.

El hombre que estaba hecho de paja

La lógica está compuesta de ideas llamadas premisas. Incluso si parecen lógicas, es importante prestar atención a aquellas premisas para asegurarnos de que no estén hechas de paja. Los “hombres de paja” son versiones fuera de tema, simplonas, exageradas o sutilmente modificadas de tu argumento que otros pueden derribar fácilmente, mientras que sigue pareciendo lógico.

Por ejemplo, quizás estás discutiendo sobre si las vacunas pueden reducir el número de gente que enferma de un virus en particular. En respuesta, alguien propone un contra-argumento diciendo que las farmacéuticas hacen grandes ganancias vendiendo vacunas. El foco de la discusión está siendo modificado de los beneficios de la vacunación al enriquecimiento. Es fácil también pensar que todos están de acuerdo con tus premisas iniciales. Pero malos entendidos o falsas premisas pueden añadirse casualmente.

Por ejemplo, puedes decir que el sarampión te enferma, la vacuna contra el sarampión contiene el virus del sarampión y por lo tanto la vacuna del sarampión te enferma. En estos hechos simplificados, la conclusión es lógica. Pero las premisas pueden no ser tan sólidas. Necesitas demostrar que la vacuna del sarampión, la cual contiene el mismo virus está presente en la forma que te puede hacer enfermar. La vacuna contra el sarampión en realidad contiene una forma rota del virus que se reproduce lentamente y no te enferma. Es una sutil, pero bastante significativa diferencia.

Incluso simplificar mucho un desacuerdo, hacia el a favor o en contra, verdadero o falso, blanco y negro puede usarse para despistarte. Recuerda, puede haber más de una solución.

Algo personal

Algunos argumentos se concentran en la persona y no en lo que dicen. Una forma de mantenerse concentrado en la discusión es pensar en la frase deportiva: “ve hacia la pelota, no hacia el jugador”.

Es difícil escuchar a gente que no nos cae bien y difícil estar en desacuerdo con aquellos en quienes confiamos y admiramos. Pero hay una diferencia entre las personas y lo que éstas dicen. Por ejemplo, puede que no te guste una empresa de combustibles fósiles debido a su pasado de comportamientos ilegales y poco éticos. Un sonriente representante de la compañía aparece en televisión diciendo que su departamento de investigación ha descubierto una clase de petróleo limpio y ambientalmente amigable. Es demasiado fácil sospechar de sus acciones. Después de todo, no te gustan. Ellos podrían estar mintiendo para ganar dinero. El historial de la compañía podría insinuar que sus acciones podrían requerir una discusión más detallada, pero no puedes lógicamente afirmar que están equivocados basado sólo en eso.

Vincular tu desagrado con tu escepticismo es atacar al jugador, no al problema. No puedes ser un experto en todo y cómo te sientas acerca de una persona puede ser un tentador primer paso para decidir si confías en ellos. Pero los argumentos basados en quién confías y de quién sospechas, simplemente no son válidos.

Nos dirigimos a los expertos cuando buscamos buenos consejos. Sin embargo, afirmar que una conclusión es lógicamente cierta porque un experto la hizo, es un argumento pobre. El cambio climático no es un problema porque los expertos lo digan, es una preocupación porque los hechos y la lógica indican que el calentamiento global es una conclusión evidente.

Esto no quiere decir que deberíamos ignorar a los expertos, en vez de eso necesitamos hacer preguntas para entender mejor los hechos y la lógica que ellos usan.

La falacia del jugador

Has visto a esta moneda girar nueve veces. Cara, cruz, luego cara otra vez, luego cruz, cruz, cruz, cruz, cruz, cruz. ¿Y qué va a aparecer ahora? Cruz ha tenido una buena racha, así que debe ser otra cruz. ¿O esperamos otra cara?

Hay patrones por todas partes en el universo y nuestro cerebro es muy bueno reconociéndolos. Quizás demasiado. Puede ver fácilmente patrones que simplemente no están ahí. En realidad, hay un cincuenta por ciento de probabilidades para una cara y un cincuenta por ciento de probabilidades para una cruz, después de cada lanzamiento. No importa qué haya salido antes, y la suerte no tiene nada que ver. En absoluto. Pero es difícil mover esa sensación de que hay un patrón ahí en alguna parte si no miramos con suficiente cuidado. Esta es la llamada “Falacia del Jugador”. Nuestra suposición de que la probabilidad cambia dependiendo de los resultados previos.

Y esto puede explicar por qué los casinos ganan tanto dinero. Todo es un asunto de probabilidades, una de las formas de la lógica más complicadas. De hecho, es tan complicada que fue sólo hace un par de siglos que un par de espabilados franceses llamados Pascal y de Fermat resolvieron mucha de la matemática detrás de este problema.

Nuestros cerebros hacen difícil para nosotros ver la lógica en probabilidad y nos lleva a error. Estamos determinados a enlazar las cosas que vemos como si estuviesen relacionadas. Por ejemplo, ver un rayo de luz y escuchar un estruendo de tormenta hace parecer como si la tormenta fuese causada por el rayo. Y hay muchas razones para creer que es verdad. Pero y si te comes un perrito caliente y luego te pones enfermo ¿fue el perrito caliente o fue algo que no tiene nada que ver?

La medicina está llena de preguntas confusas. La gente toma pastillas y se siente mejor, pero es necesaria mucha lógica y probabilidad para determinar si es que las pastillas fueron realmente responsables. Sólo porque una cosa siga a la otra, incluso si esto pasa un par de veces, no necesariamente significa que estén relacionadas. Pudo haber otros factores, o pudo ser simplemente una coincidencia.

Para saber con certeza tienes que examinar las circunstancias una y otra vez buscando aquellos otros factores que podrían desacreditar el vínculo. Esto refuerza la confianza de que tu patrón es cierto. Esto es lo que la ciencia hace.

Así que mientras nuestro cerebro ve patrones, y esto a menudo es muy útil, le toca a la ciencia probar que esos patrones son reales.

El principio de precaución

No actuar hasta que tengas una buena idea de cualquier consecuencia adversa es lo que se llama el principio de precaución. Esto pasa todos los días. Los productos son probados antes de salir al mercado para probar que son seguros. Porque hay una posibilidad de que no lo sean. Pero es difícil quitar todas las preocupaciones acerca de los riesgos asociados a cada acción. Menos aún aquellos basados en la complicada serie de pruebas y observaciones requeridas por la ciencia.

Y aquí es cuando nos encontramos ante alguna confusión sobre cómo funciona la ciencia. Algunos dicen que el calentamiento global y la evolución no son hechos, son sólo teorías. Pero no hay un “sólo” en esto. En ciencia, la palabra “teoría” no significa “suposición” sino una regla bien probada, la cual está basada en lógica, explica observaciones repetidas y ha sido usada para hacer predicciones precisas.

Esto las hace increíblemente útiles y difíciles de ignorar. La teoría de la atracción gravitacional de Newton, es una teoría. Explica cómo los objetos con masa se mueven de la manera en que lo hacen. Es una teoría tan útil que algo que fue publicado hace 300 años todavía es usado para enviar objetos desde la Tierra a los lejanos rincones del sistema solar. Los hechos observables o probados son sólo parte de la ciencia.

Cuando nos enfrentamos con los riesgos, es natural querer esperar hasta que haya un cien por ciento de certeza al respecto. Desafortunadamente es imposible. Lo mejor que puede lograrse es que dadas todas las teorías existentes actualmente, repetidas las pruebas, la lógica y los hechos, estemos razonablemente confiados en que algo es seguro. Y aquí es donde el principio de precaución puede ser mal empleado. Esperar por más información es útil, pero esperar el inalcanzable cien por ciento, ciertamente previene a todo el mundo de lograr cualquier cosa.

Considera a los móviles y los miedos de que su emisión de radiación pueda provocar cáncer. Si elegimos esperar hasta que los teléfonos móviles sean probados para un cien por ciento de seguridad o no, no tendríamos la tecnología de la telefonía móvil. El cáncer no es algo para tomarse a la ligera y las preocupaciones nunca deberían ser desechadas. Pero esperar por datos irrefutables, lo cual es lógicamente imposible, es una mala manera de tomar decisiones.

Y haciendo eso, podemos perder increíbles oportunidades o encontrar nuevos riesgos. Solicitar información sobre los riesgos es algo prudente. Pero pedir un cien por ciento de seguridad, detiene la evolución tecnológica.