Comment corriger Eigen3 setRandom() produisant toujours les mêmes valeurs
Problème
Vous utilisez la fonction setRandom() d’Eigen3 pour randomiser les valeurs dans un vecteur donné.
Cependant, vous remarquez que les valeurs aléatoires générées par setRandom() sont toujours les mêmes.
Code d’exemple :
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;
}Lorsque vous exécutez ce code plusieurs fois, vous obtenez la même sortie à chaque fois :
eigen_setrandom_output.txt
Random vector:
0.680375
-0.211234
0.566198Solution
Eigen3 utilise simplement rand() de libc, qui est, par défaut, toujours initialisé avec la même graine.
Afin de définir une graine (pseudo-)aléatoire, vous pouvez utiliser l’extrait de code suivant :
eigen_setrandom_seed.cpp
srand(time(0)); // Définir une graine aléatoire basée sur l'heure actuelle
Notez que cette graine spécifique ne changera qu’une fois par seconde.
Exemple complet
eigen_setrandom_full.cpp
#include <iostream>
#include <Eigen/Dense>
#include <ctime>
int main() {
Eigen::VectorXd v = Eigen::VectorXd::Zero(3);
srand(time(0)); // Définir une graine aléatoire basée sur l'heure actuelle
v.setRandom();
std::cout << "Random vector:" << std::endl << v << std::endl;
return 0;
}Check out similar posts by category:
C/C++
If this post helped you, please consider buying me a coffee or donating via PayPal to support research & publishing of new posts on TechOverflow