¿Qué está mal con f(random(..), random(..)) en C?
Me encontré con un problema que realmente me confundió. Estaba tratando de calcular los valores de f(x, y) = (y^3)/(x^2+y^2) en algunos puntos aleatorios en -1<x<1 y=""></x<1><y<1. aquí=”” está=”” mi=”” código:=””></y<1.><stdio.h>
#include<stdlib.h>
#include<math.h>
#define f(x, y) ( pow((y),3) / (pow((x),2) + pow((y),2)) )
double random(double min, double max)
{
double m;
m = rand()/(double)RAND_MAX;
return (min + m * (max – min));
}
void main()
{
int i;
double v;
for(i = 0; i < 500; i++)
{
v = f(random(-1,1), random(-1,1));
printf("%lf\n", s);
}
}
Y luego obtuve algunos valores muy extraños que son mayores que 1 o menores que -1 (que son el máximo y el mínimo que f puede obtener en -1<x<1 y=""></x<1><y<1).
por otro lado, cuando cambié mi código usando 2 variables que llevan valores x e y aleatorios y luego los enchufé en f:
double x, y;
for(i = 0; i < 500; i++)
{
x = random(-1,1);
y = random(-1,1);
v = f(x, y);
printf("%lf\n", s);
}
el problema desapareció. ¿alguien puede explicarme esto? ¡gracias de antemano! por=”” otro=”” lado,=”” cuando=”” cambié=”” mi=”” código=”” usando=”” 2=”” variables=”” que=”” llevan=”” valores=”” x=”” e=”” y=”” aleatorios=”” y=”” luego=”” los=”” enchufé=”” en=”” f:=”” double=”” x,=”” y;=”” for(i=”0;” i=”” <=”” 500;=”” i++)=”” {=”” x=”random(-1,1);” y=”random(-1,1);” v=”f(x,” y);=”” printf(“%lf\n”,=”” s);=”” }=”” el=”” problema=”” desapareció.=”” ¿alguien=”” puede=”” explicarme=”” esto?=”” ¡gracias=”” de=””></y<1).
por otro lado, cuando cambié mi código usando 2 variables que llevan valores x e y aleatorios y luego los enchufé en f:
double x, y;
for(i = 0; i < 500; i++)
{
x = random(-1,1);
y = random(-1,1);
v = f(x, y);
printf("%lf\n", s);
}
el problema desapareció. ¿alguien puede explicarme esto? ¡gracias de antemano!></math.h></stdlib.h></stdio.h>
davy.ai
El problema con la primera implementación del código es que cada llamada a la función
random
genera un nuevo conjunto de valores aleatorios tanto parax
como paray
, por lo tanto es posible obtener valores parax
ey
que estén fuera del rango de-1 < x < 1
y-1 < y < 1
. Esto hace que la funciónf
devuelva valores que están fuera del rango esperado de-1 < f(x,y) < 1
.En la segunda implementación, los valores de
x
ey
se generan fuera del bucle y se mantienen constantes en cada iteración, asegurando así que siempre estén dentro del rango de-1 < x < 1
y-1 < y < 1
.Para solucionar el problema en la primera implementación, los valores de
x
ey
generados por la funciónrandom
deben ser verificados antes de llamar a la funciónf
para asegurarse de que estén dentro del rango esperado. Si no están dentro del rango, se deben generar nuevos valores aleatorios hasta encontrar valores válidos.