Gaussien générateur de nombre aléatoire

Je suis en train de mettre en œuvre une gaussienne distribué générateur de nombre aléatoire dans l'intervalle [0,1].

float rand_gauss (void) {
  float v1,v2,s;

  do {
    v1 = 2.0 * ((float) rand()/RAND_MAX) - 1;
    v2 = 2.0 * ((float) rand()/RAND_MAX) - 1;

    s = v1*v1 + v2*v2;
  } while ( s >= 1.0 );

  if (s == 0.0)
    return 0.0;
  else
    return (v1*sqrt(-2.0 * log(s) / s));
}

C'est à peu près tout droit vers l'avant de la mise en œuvre de l'algorithme de Knuth du 2e volume de TAOCP 3e édition, page 122.

Le problème est que rand_gauss() retourne parfois des valeurs en dehors de l'intervalle [0,1].

Une gaussienne est sans limite. Ai-je raté quelque chose?
il y a une variance et de la moyenne, je prends la moyenne 0 et de variance^2 comme 1, de la distribution normale standard.
Une distribution normale standard peut prendre n'importe quelle valeur entre -l'infini et l'infini, avec une certaine probabilité; il n'y a pas de limite sur le résultat.
Est-il une raison pour laquelle vous êtes à l'aide de float plutôt que double? Habituellement, c'est une mauvaise idée..
L'arithmétique sur float et double est presque certainement le même coût, de plus, vous êtes à la conversion d'avant en arrière pour double de toute façon lorsque vous appelez log et sqrt.

OriginalL'auteur | 2011-03-13