Wie man behebt, dass Eigen3 setRandom() immer die gleichen Werte erzeugt

Problem

Sie verwenden Eigen3s setRandom()-Funktion, um die Werte in einem gegebenen Vektor zu randomisieren.

Sie stellen jedoch fest, dass die von setRandom() erzeugten Zufallswerte immer gleich sind.

Beispielcode:

eigen_setrandom_same_values.cpp
#include <iostream>
#include <Eigen/Dense>

int main() {
    Eigen::VectorXd v = Eigen::VectorXd::Zero(3);
    v.setRandom();
    std::cout << "Random vector:" << std::endl << v << std::endl;
    return 0;
}

Wenn Sie diesen Code mehrfach ausführen, erhalten Sie jedes Mal die gleiche Ausgabe:

eigen_setrandom_output.txt
Random vector:
 0.680375
-0.211234
 0.566198

Lösung

Eigen3 verwendet einfach rand() aus libc, das standardmäßig immer mit dem gleichen Seed initialisiert wird.

Um einen (pseudo-)zufälligen Seed zu setzen, können Sie den folgenden Code-Schnipsel verwenden:

eigen_setrandom_seed.cpp
srand(time(0));  // Set a random seed based on the current time

Beachten Sie, dass dieser spezifische Seed nur einmal pro Sekunde wechselt.

Vollständiges Beispiel

eigen_setrandom_full.cpp
#include <iostream>
#include <Eigen/Dense>
#include <ctime>

int main() {
  Eigen::VectorXd v = Eigen::VectorXd::Zero(3);
  srand(time(0));  // Set a random seed based on the current time
  v.setRandom();
  std::cout << "Random vector:" << std::endl << v << std::endl;
  return 0;
}

Check out similar posts by category: C/C++