Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Problema Con Un Rand

Iniciado por Sacrifai, 13 de Noviembre de 2004, 06:00:58 PM

« anterior - próximo »

Sacrifai

 Pues eso, ¿me podriais decir que está mal en esta linea?

y1=y1+(int)cos(x)*rand()%(-((int)sin(x)*rand()%5))+((int)sin(x)*rand()%5);

La compilo y todo bien, pero luego me da error al ejecutar el programa. y1 y x son enteros. Gracias

Juan Mellado

 ¿Qué error te da?
¿Qué lenguaje/herramienta estás usando para compilar?

Lo más seguro es que esté dándote un error "división por cero" (esto es una suposición). Declara una variable para el divisor y comprueba que no sea cero (o un número muy próximo a cero) antes de dividir.

Saludos

Offtopic: ¡Vaya firmita!  :huh: Haber->A ver (Powered by MarsCorrector)

Sacrifai

 Uso Visual C++ 6. Y si, creo que casi podria ser lo que tu dices, ya que esto da valores muy bajos (a proposito, claro), 800 veces, asi que va a ser eso.¿Como podria arreglarlo? Porque nesesito que me de cero de vez en cuando.

Gracias.

Offtopic:
Lo tendré en cuenta  :rolleyes: .

gdl

 Te aconsejo que no pongas tantas cosas en una misma línea. No te preocupes por usar variables intermedias (de todas formas el compilador va a usar temporales anónimos).

Probablemente el fallo sea la división por cero entera en el primer %. Además, es extraño hacer el % usando un número negativo como denominador... no sé si habrá fallo conceptual por lo que la pregunta sería ¿qué quieres hacer?

Sacrifai

 El objetivo era hacer un generador de terrenos 2d en plan worms. Pero visto lo visto, casi que mejor lo dejo  :P .

Pogacha

 Sin mirar los otros replies:
Citar(-((int)sin(x)*rand()%5))+((int)sin(x)*rand()%5)
puede es cero si x=0 y si haces % 0 da error de division.
Ademas te anuncio que no es en la complejidad donde obtengo aleatoriedad.
Saludos

Sacrifai

 Una cosa pogancha. Yo con lo que sé de 4º de ESO supongo que no debería llevarte la contraria ( por tener una base matemática menor ). Pero si no me equivoco, el seno y el coseno devuelven un numero entre -1 y 1, por lo tanto la enorme mayoría de veces es decimal, y si lo conviertes en int...

¿ Me equivoco ?

synchrnzr

 Al convertirlo en int, por truncamiento te da 0 si 0 <= sin(x) < 1, es decir, para todos los valores positivos excepto el 1. Aunque por redondeo te daria igualmente 0 para  -0.5 < sin(x) < 0.5.

CitarPero si no me equivoco, el seno y el coseno devuelven un numero entre -1 y 1, por lo tanto la enorme mayoría de veces es decimal, y si lo conviertes en int...

Si aceptas esta suposición, deberías especificar en la documentación de tu programa que éste petará aleatoriamente (me remito a la Ley de Murphy: si algo puede ir mal irá mal... aunque en realidad acaba yendo peor)

sync

Pogacha

 Si lo conviertes en int se transforma en 0, y basta que una vez te de 0 para que Crash!!!.
Viendo mas en detalle tu ecuacion encuentro que tienes muchas mas posibilidades de que te de error de division, con los Rand%5 te da un numero de 0 a 4 con lo cual es un desastre tambien.
Mi consejo es que no debes usar tantos rand ni funciones tan rebuscadas, si te fijas, la mayoria de las funciones de aleatoriedad son muy sencillas para cualquier caso que represente.

CitarEl objetivo era hacer un generador de terrenos 2d en plan worms. Pero visto lo visto, casi que mejor lo dejo
Si lo dejas, mejor deja la programación, es la perceberancia lo unico que te puede llevar al exito.
Saludos y suerte.

Edit: Sync, se adelanto, y te respondió mas elegantemente, no es que no lo halla visto es que posteo a la vez, estabamos fuera de sync.

Sacrifai

Cita de: "Pogacha"Si lo dejas, mejor deja la programación, es la perceberancia lo unico que te puede llevar al exito.
Hasta cierto limite. Si me tiro toda la tarde para hacer esto por gusto, que ni si quiera voy a usarlo y no sale, pues esperaré a saber más para hacerlo. Seguro que todos han dejado algo sin hacer alguna vez.

synchrnzr

 Yo lo que no entiendo de dónde sale una fórmula tan complicada para lo que dices. Es decir, no veo porqué no puedes hacer algo del estilo:

y1 = ( int )( rand() * ALTURA_MAXIMA );

Creo que con eso ya tienes de sobra para generar un terreno aleatorio. Luego podrias complicarlo un poco más usando interpolaciones, splines, fractales, etc... para obtener un terreno más realista.

sync

[EX3]

 
Cita de: "Sacrifai"Hasta cierto limite. Si me tiro toda la tarde para hacer esto por gusto, que ni si quiera voy a usarlo y no sale, pues esperaré a saber más para hacerlo. Seguro que todos han dejado algo sin hacer alguna vez.
Si cada vez que me encontrase con alguna complicacion tuviese ke abandonar mis proyectos no tendria nada en absoluto. 4 años me llevo desarrollar la dx_lib32 entre que tuve aprender el uso de directX y corregir multitud de fallos ilogicos que me generaba Visual Basic pero ahi lo tienes, un proyecto terminado y que funciona.

Por muy complicado ke se te haga llevar a cabo algo nunca tires la toalla y sigue insistiendo por ke al final siempre encontraras la forma de seguir adelante, y si has dejar algo sin hacer que sea para retomarlo dentro de un tiempo, nunca para abandonarlo. Y aunque eso que estas haciendo no llegues a usarlo siempre aprenderas algo por poco que sea.

Momentos de falqueza los tenemos todos  ;)

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

Sacrifai

  (ole) En fin, lo intentaré con formulas mas sencillas como la que dice synchrnzr. Si sale, ya os comentaré.

Pogacha


Ffelagund

a href='http://www.typhoonlabs.com' target='_blank'>http://www.typhoonlabs.com

"no se... con un vuelo... indiferente"






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.