Buenas! Estoy intentando realizar un ejercicio del lanzamiento de una moneda, guardando cuantas veces sale cada resultado y calculando los porcentajes de los dos resultados posibles. El problema que tengo es que al realizar la división para posteriormente expresar la fracción, siempre da 0 y no encuentro la manera de solucionarlo.
Un saludo.
//Variables globales
int cara = 0;
int cruz = 0;
void setup(){
Serial.begin(9600);
}
void loop(){
for (int i=1; i<100; i++){
int NumeroRandom = random(1, 1000000);
if (NumeroRandom % 2 ==0){//contador caras
cara +=1;
Serial.println("caras: " + String(cara));
delay(1000);
}
if (NumeroRandom % 2 !=0){//contador cruces
cruz +=1;
Serial.println("cruces: " + String(cruz));
delay(1000);
}
if (i % 10 == 0){//recuento total y expresión porcentaje
int total = cruz + cara;
Serial.println("Comprobacion: " + String(total));
Serial.println("El numero total de resultados es: " + String(total));
Serial.println("El numero de caras es: " + String(cara/total));
Serial.println("El numero de cruces es: " + String(cruz/total));
}
}
}
Si haces una operación entre enteros el resultado es un entero.
Como tus divisiones dan resultados menores a 1, se truncan los decimales y obtienes 0.
Prueba con
String(cara/(float)total)
Lo mismo para cruz.
Al tipificar total como float el resultado ahora es del mismo tipo y no se pierden los decimales.
No entiendo el propósito de este código. ¿Quiere comprobar si el generador de números aleatorios es "justo" (es decir, genera un número idéntico de valores pares o impares)?
¿Sabías que el generador de números aleatorios es en realidad "pseudoaleatorio"?
Y cuando usas "random()" deberías inicializar lo que se llama "seed" ("semilla") con la función randomSeed() a partir de la cual el algoritmo produce la misma secuencia de números aleatorios (con el mismo "seed" los números son los mismos...).
En Arduino (sin agregar hardware externo) la única forma de tener "seed" es utilizar la lectura de un pin analógico (por ejemplo, "A0") que, al "fluctuar", dará valores que dependen sólo de esta fluctuación o de la interferencia electromagnética. Este valor obviamente solo va entre 0 y 1023, por lo que nunca tendrás más de 1024 secuencias de números aleatorios, y generalmente por "randomSeed()" uso una combinación de al menos dos lecturas de A0 (espaciados con un delay() de al menos 50 ms)...
Sí, lo sé, pero la finalidad con la que buscaba hacer el código era simplemente didáctica, no buscaba comprobar si el generador era "justo" o no, solo quería saber si era capaz de desarrollar el ejercicio.
Muchas gracias por responde al post. ¡Que tengas un buen día!
Si quieres experimentar con números aleatorios, prueba estas pequeñas modificaciones, que puedes usar en cualquier programa en el que necesites tener valores "pseudoaleatorios":
...
// Set a better "seed"
void setSeed(byte pin, int num) {
unsigned long seed = analogRead(pin) * 1024UL;
for (int i=0; i<num; ++i) {
delay(50)
seed += analogRead(pin) * (i+1);
}
randomSeed(seed);
}
...
void setup(){
Serial.begin(9600);
setSeed(A0, 5);
}
...