70 Stimmen

Wie erzeugt man in C++ einen zufälligen Double, der gleichmäßig zwischen 0 und 1 verteilt ist?

Wie erzeugt man in C++ einen zufälligen Double, der gleichmäßig zwischen 0 und 1 verteilt ist?

Natürlich fallen mir einige Antworten ein, aber ich würde gerne wissen, was die gängige Praxis ist, die man hat:

  • Gute Einhaltung der Normen
  • Gute Zufälligkeit
  • Gute Geschwindigkeit

(Geschwindigkeit ist für meine Anwendung wichtiger als Zufälligkeit).

Herzlichen Dank!

PS: Falls das eine Rolle spielt, meine Zielplattformen sind Linux und Windows.

-2voto

Dean Punkte 13
//Returns a random number in the range (0.0f, 1.0f).
// 0111 1111 1111 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
// seee eeee eeee vvvv vvvv vvvv vvvv vvvv vvvv vvvv vvvv vvvv vvvv vvvv vvvv vvvv
// sign     = 's'
// exponent = 'e'
// value    = 'v'
double DoubleRand() {
  typedef unsigned long long uint64;
  uint64 ret = 0;
  for (int i = 0; i < 13; i++) {
     ret |= ((uint64) (rand() % 16) << i * 4);
  }
  if (ret == 0) {
    return rand() % 2 ? 1.0f : 0.0f;
  }
  uint64 retb = ret;
  unsigned int exp = 0x3ff;
  retb = ret | ((uint64) exp << 52);
  double *tmp = (double*) &retb;
  double retval = *tmp;
  while (retval > 1.0f || retval < 0.0f) {
    retval = *(tmp = (double*) &(retb = ret | ((uint64) (exp--) << 52)));
  }
  if (rand() % 2) {
    retval -= 0.5f;
  }
  return retval;
}

Das sollte genügen, ich habe Wikipedia-Artikel, um dies zu erstellen. Ich glaube, er ist so gut wie drand48();

-2voto

timxor Punkte 905

Das habe ich für meine Bedürfnisse verwendet:

int range_upper_bound = 12345;
int random_number =((double)rand()/(double)range_upper_bound);

-3voto

foo'pitier Punkte 43
double randDouble()
{
  double out;
  out = (double)rand()/(RAND_MAX + 1); //each iteration produces a number in [0, 1)
  out = (rand() + out)/RAND_MAX;
  out = (rand() + out)/RAND_MAX;
  out = (rand() + out)/RAND_MAX;
  out = (rand() + out)/RAND_MAX;
  out = (rand() + out)/RAND_MAX;

  return out;
}

Nicht ganz so schnell wie double X=((double)rand()/(double)RAND_MAX); , aber mit besserer Verteilung. Dieser Algorithmus liefert nur RAND_MAX gleichmäßig verteilte Rückgabewerte; dieser Algorithmus liefert RANDMAX^6, so dass seine Verteilung nur durch die Genauigkeit von double begrenzt ist.

Wenn du ein langes Double willst, füge einfach ein paar Iterationen hinzu. Wenn Sie eine Zahl im Bereich [0, 1] statt [0, 1] wollen, muss Zeile 4 lauten out = (double)rand()/(RAND_MAX); .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X