2012-04-06 7 views
4

の2つの区間[a、b]の間に均等に分布する乱数を生成する必要があります。abも二重数です。2つの区間[a、b]の間に乱数を生成する

これらのXの数値は、クラス関数の内部で生成する必要があります(例:myclass::doSomething(a,b))。事は、doSomething(a,b)関数が別のクラス関数、たとえばdoThat()によって呼び出されるたびに、doSomething(a,b)関数に渡された間隔[a,b]が変化することです。

私は私を可能にするソリューションたいと思います:高い範囲でengineをお持ちの
1.を、理想的には、それは一度だけアプリケーションの実行ごとに播種する必要があります。
2. doSomething()関数を呼び出すたびに生成されたXのランダムな倍数は、一様に分配する必要があります。

私の解決策では、engineのスコープが高くなっていないため、生成された数値が必ずしも均一に分散されているとは限りません。

//file: utilities.h 
template <typename Generator> 
double randomDoubleEngine(Generator& engine, double low_bound, double high_bound) 
{ 
     if (low_bound > high_bound){ 
       std::swap(low_bound, high_bound); 
     } 

     return std::uniform_real_distribution<>(low_bound, high_bound)(engine); 
} 

//file: myclass.h 
     void myclass::doThat(param1, param2){ 

      for(int i=0; i < myclass.iter; i++){ 
       ... 
       ... 
       doSomething(a,b); 
       ... 
      } 

     } 

     void myclass::doSomething(double a, double b) 
     { 
       std::random_device rd; 
       static std::mt19937 engine(rd()); 
       ..... 
       double curThreshold = randomDoubleEngine(engine, a, b); 
       ... 
     } 
+7

解決策はありますか?もしそうなら、あなたは解決する必要がある問題は何ですか?言い換えれば、SOの視聴者のための質問は何ですか? –

+1

@OliCharlesworth、私の解決策は完全には機能しません。元の投稿を更新しました。第1に、「エンジン」はグローバルではなく、第2に、生成された数は一様に分布していないように見える。 – Tin

+4

分布の均一性を決定するためにどのようなテストを行いましたか、サンプルサイズはどのくらいでしたか? BTWでは、2つの数字が異なる場合、生成された2つの数字の差異は**一様ではないことに注意してください。 – MSalters

答えて

2

私はエンジンをmyclassの静的メンバーにしたいと思います。あなたが他の方法でエンジンを使う必要がない限り、それがあなたが持っているものと実際の違いを生み出すかどうかはわかりません。私は以下の解決策を貼り付けました。

標準に比べてgccの見た目が間違っていることに注意してください(コードコメントのリンクを参照)。なぜなら、これらの数値に適用するテストが失敗する。私が理解しているように、gccはエンジンが[0,1]で数値を返すことを望んでいますが、標準ではある範囲にわたって一定の整数でなければならないとしています。

私は古いUbuntuリリースを実行しており、ideoneはstd :: random_deviceを許可していないようだからgcc 4.4でしかテストできないのではないかと心配です。

#include <random> 
#include <iostream> 

/* In GCC 4.4, uniform_real_distribution is called uniform_real; renamed in 4.5 
* 
* However, GCC's description here 
* 
* http://gcc.gnu.org/onlinedocs/libstdc++/libstdc++-api-4.6/a00731.html 
* 
* doesn't match expectation here 
* 
* http://en.cppreference.com/w/cpp/numeric/random/uniform_real_distribution 
* 
* which seems to match 26.5.8.2.2 of N3337 
* 
*/ 
#if defined(__GNUC_MINOR__) && (__GNUC_MINOR__ <= 4) 
# define uniform_real_distribution uniform_real 
#endif 

template <typename Generator> 
double randomDoubleEngine(Generator& engine, double low_bound, double high_bound) 
{ 
    if (low_bound > high_bound){ 
    std::swap(low_bound, high_bound); 
    } 
    return std::uniform_real_distribution<double>(low_bound, high_bound)(engine); 
} 

class myclass 
{ 
    double curThreshold; 
    static std::mt19937 engine; 
    void doSomething(double a, double b) 
    { 
    curThreshold= randomDoubleEngine(engine, a, b); 
    } 
public: 
    myclass(): curThreshold(0) {} 

    void doThat(){ 
    doSomething(0,10); 
    std::cout << "threshold is " << curThreshold << std::endl; 
    } 
}; 

std::mt19937 myclass::engine=std::mt19937(std::random_device()()); 

int 
main() 
{ 
    myclass m; 
    m.doThat(); 
    m.doThat(); 
    return 0; 
} 
+0

はOPが探しているもののようです。 –

+0

これは同じではありません。 uniform_real_distributionは、[a、b]ではなく[a、b]の範囲で生成されます。 –

関連する問題