2012-04-18 9 views
1

단위 구에서 임의의 점을 선택하려고하는데 부스트가 정확히 이것을하는 분포를 제공한다는 것을 알았습니다. 하지만 사용하려고하면 생성 된 모든 값은 nan입니다. 내가 뭘 잘못하고 있는지 모르겠다. 내게 계몽 해 주겠니? 이 작은 코드는 내가 뭘하려고 오전 묘사 :boost :: uniform_on_sphere 사용하는 방법?

#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 

광고 인해서

...

+0

코드 (무한 루프없이 부스트 1.48 물론 사용) 나를 위해 잘 작동합니다. 나는 당신의 버젼의 버젼에 버그가 있다고 생각합니다. –

답변

2

난 당신이 부스트 1.49를 사용하고 있으리라 믿고있어. 이 경우 아래의 방법이 효과적입니다.

부스트가 다소 복잡합니다. uniform_on_sphere 인 개체는 점을 그릴 때 필요한 요소 중 하나 일 뿐이며 배포 부분입니다. 아래 작업 .cpp 파일의 행을 따라 boost::variate_generator을 만들어야합니다.

참고 : 시드에는 시스템 시간을 사용하는 경우를 포함합니다. 사용자에게 맞게 수정할 수 있어야합니다.

// 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; 
} 

내가 콘솔이 실행

, 나는 겉으로는 정확한 물건을 얻을 :

[email protected]:~/Desktop/Programming/C++/RandOnSphere$ g++ -I /usr/include/boost_1_49/ -L /usr/include/boost_1_49/stage/lib randomOnSphere.cpp -o ros 
[email protected]:~/Desktop/Programming/C++/RandOnSphere$ ./ros 
0.876326 -0.0441729 0.479689 
[email protected]:~/Desktop/Programming/C++/RandOnSphere$ ./ros 
-0.039037 -0.17792 0.98327 
[email protected]:~/Desktop/Programming/C++/RandOnSphere$ ./ros 
-0.896734 0.419589 -0.14076 
+0

발견 됨, 일관되지 않은 사용법은 입니다. – lvella

+0

N/m 알겠습니다. 내 최상위 코드 섹션에서 나는 잘못 된 (지금 편집 됨)을 가졌습니다. 그래도 작동하는 하단의 코드입니다. 팁 주셔서 감사. – ely

+0

그리고 문서에서 직접적으로 사용할 수있는 배포판과이 variate_generator가 필요한 요소를 지정하는 곳은 어디입니까? 튜토리얼의 모든 샘플은 생성기에서 직접 분배를 사용합니다. – lvella