Ok, muchas gracias voy a probarlo un poco mas, ya he hecho las modificaciones y tiene mejor pinta el resultado.<br><br>GRacias<br><br><div class="gmail_quote">2009/3/25 Steven Davidson <span dir="ltr"><<a href="mailto:srd4121@njit.edu">srd4121@njit.edu</a>></span><br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">Hola Vicente,<div><div></div><div class="h5"><br>
<br>
vicente lozano wrote:<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Hola,<br>
<br>
He escrito una clase error (adjuntas) para hacer unas simulaciones de filtrados.<br>
<br>
El problema es que los numeros aleatorios no me huelen muy bien<br>
porque por ejemplo, hago 300 "mediciones" con un error entre -20 y<br>
+20 unidades sobre una medida teorica de 10 y la media de las 300<br>
mediciones sale muy aproximada a 12 todo el tiempo. He probado a<br>
reseedear el random pero el resultado es el mismo todo el tiempo y no<br>
entiendo porque.<br>
<br>
A ver si me podeis echar una mano y depaso si veis algun fallo de disenyo sobre el codigo y eso pues agradeceria que me lo comentarais para aprender a hacer las cosas mejor.<br>
<br>
</blockquote>
<br></div></div>
Creo que tienes un error de diseño en la implementación de los operadores aritméticos. Escribes lo siguiente:<br>
<br>
double operator+( const double d, Error e );<br>
double operator-( const double d, Error e );<br>
double operator*( const double d, Error e );<br>
double operator/( const double d, Error e );<br>
ostream &operator<<( ostream &os, Error e );<br>
<br>
El error común a estos prototipos, y equivalentes, es que pasas los objetos de la clase 'Error' por copia. Esto implica que se instancia un nuevo objeto local a cada función. Estas instanciaciones infieren que se "reinicia", por así decirlo, el generador de números pseudo-aleatorios. Esto es porque el constructor invoca 'srand()'. Deberías pasar los objetos por referencia, pero como no tenemos intención de modificar el objeto, lo tratamos como una constante; esto es,<br>

<br>
double operator+( const double d, const Error &e );<br>
double operator-( const double d, const Error &e );<br>
...<br>
<br>
De todas maneras, sugiero eliminar 'srand()' del constructor y simplemente invocarla al principio de 'main()'. Si de verdad quieres seguir una "filosofía" de la POO, entonces supongo que podrías crear una variable estática para indicar si se ha iniciado o no el generador. Por ejemplo,<br>

<br>
class Error<br>
{<br>
  static bool bIniciarGenerador;<br>
  ...<br>
};<br>
<br>
bool Error::bIniciarGenerador = true;<br>
<br>
Error::Error( double min, double max )<br>
: _min(min), _max(max), _lastError(0)<br>
{<br>
  if( bIniciarGenerador )<br>
  {<br>
    bIniciarGenerador = false;<br>
    srand( (unsigned) time(0) );<br>
  }<br>
  err();<br>
}<br>
<br>
Creo que hay otra manera, pero ahora mismo no caigo.<br>
<br>
<br>
Espero que esto te solucione el problema de aleatoriedad.<br>
<br>
Steven<br>
<br>
<br>
_______________________________________________<br>
Lista de correo Cconclase <a href="mailto:Cconclase@listas.conclase.net" target="_blank">Cconclase@listas.conclase.net</a><br>
<a href="http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net" target="_blank">http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net</a><br>
Bajas: <a href="http://listas.conclase.net/index.php?gid=2&mnu=FAQ" target="_blank">http://listas.conclase.net/index.php?gid=2&mnu=FAQ</a><br>
</blockquote></div><br>