1

単位球上のランダムな点を選択しようとしていますが、ブーストがまさにこれを行う分布を提供することがわかりました。しかし、私がそれを使おうとすると、生成された値はすべてですnan。何が間違っているのかわかりませんが、教えていただけませんか?この小さなコードは、私がやろうとしていることを表しています。

#include <iostream>
#include <fstream>
#include <vector>
#include <boost/random/mersenne_twister.hpp>
#include <boost/random/uniform_on_sphere.hpp>

int main()
{
  boost::mt19937 gen;
  boost::uniform_on_sphere<float> dist(3);

  { // Seed from system random device
    std::ifstream rand_device("/dev/urandom");
    uint32_t seed;
    rand_device >> seed;

    gen.seed(seed);
  }

  while(1) {
    // Generate a point on a unit sphere
    std::vector<float> res = dist(gen);

    // Print the coordinates
    for(int i = 0; i < res.size(); ++i) {
      std::cout << res[i] << ' ';
    }
    std::cout << '\n';
  }
}

出力は次のとおりです。

nan nan nan 
nan nan nan 
nan nan nan 
nan nan nan 

ad infinitum .. ..

4

1 に答える 1

3

Boost1.49を使用していると思います。その場合、以下の方法が機能します。

これは、ブーストが少し複雑なところです。ポイントを描画するために必要なものの1つのコンポーネントであるオブジェクトuniform_on_sphereは、配布部分です。またboost::variate_generator、以下の次の作業用.cppファイルの線に沿って作成する必要があります。

これには、シードなどにシステム時間を使用するための独自のインクルードがあることに注意してください。これは、自分に合うように変更できるはずです。

// Standards, w/ctime to seed based on system time.
#include <iostream>
#include <fstream>
#include <vector>
#include <ctime>

// Boost. Requires variate_generator to actually draw the values.
#include <boost/random/mersenne_twister.hpp>
#include <boost/random/uniform_on_sphere.hpp>
#include <boost/random/variate_generator.hpp>


int main(){

    typedef boost::random::mt19937 gen_type;

    // You can seed this your way as well, but this is my quick and dirty way.
    gen_type rand_gen;
    rand_gen.seed(static_cast<unsigned int>(std::time(0)));

    // Create the distribution object.
    boost::uniform_on_sphere<float> unif_sphere(3);

    // This is what will actually supply drawn values.
    boost::variate_generator<gen_type&, boost::uniform_on_sphere<float> >    random_on_sphere(rand_gen, unif_sphere);

    // Now you can draw a vector of drawn coordinates as such:
    std::vector<float> random_sphere_point = random_on_sphere();

    // Print out the drawn sphere triple's values.
    for(int i = 0; i < random_sphere_point.size(); ++i) {
        std::cout << random_sphere_point.at(i) << ' ';
    }
    std::cout << '\n';

    return 0;
}

これをコンソールで実行すると、一見正しいものが表示されます。

ely@AMDESK:~/Desktop/Programming/C++/RandOnSphere$ g++ -I /usr/include/boost_1_49/ -L    /usr/include/boost_1_49/stage/lib randomOnSphere.cpp -o ros
ely@AMDESK:~/Desktop/Programming/C++/RandOnSphere$ ./ros 
0.876326 -0.0441729 0.479689 
ely@AMDESK:~/Desktop/Programming/C++/RandOnSphere$ ./ros 
-0.039037 -0.17792 0.98327 
ely@AMDESK:~/Desktop/Programming/C++/RandOnSphere$ ./ros 
-0.896734 0.419589 -0.14076 
于 2012-04-18T03:47:39.830 に答える