2017-10-17 12 views
-1

forループで一様乱数を生成する必要があります。 forループは1000000の数字になります。その内部には2000というループがあります。したがって、2 * 10^9の一様乱数を生成します。私は以下の方法を使用します:C++で一様乱数を作成する最も速い方法は

#include <random> 
    double zeta; 
    unsigned seed = std::chrono::system_clock::now().time_since_epoch().count(); 
     auto uniform_rand = bind(uniform_real_distribution<double>(0,1), mt19937(seed)); 
    for(int j=0; j<1000000; j++) 
       for(int i=0; i<2000; i++) 
     zeta=-eta/2.0+uniform_rand()*eta; // in the range (-eta/2, +eta/2) 
theta[i]+=zeta; 
    end 
end 
+4

'std :: bind'は、可読性とパフォーマンスの両面でlambdasによってoutclassされがちです。 – chris

+4

これはひどい乱数です​​。その数が必要な場合は、これをスレッドに分割して複数のコアを使用してみましょう。 – tadman

+0

申し訳ありませんが、何を意味するのか分かりませんでした@ tadman –

答えて

1

あなたとほぼ同じです。私はバインダーやラムダの必要性を見ていません。

EDIT:mt19937からminstd_randに変更しました。は88倍速くです。 mt19937では、コードは質問のものとほぼ同じパフォーマンスを示します。

#include <random> 

int main() { 
    /*std::mt19937 gen(std::random_device{}());*/ 
    // Changing mt19937 to minstd_rand makes the code run 88 times faster! 
    std::minstd_rand gen(std::random_device{}()); 
    std::uniform_real_distribution<double> dist(0, 1); 
    for(unsigned int i = 0; i < 1000000; ++i) { 
     for(unsigned int j = 0; j < 2000; ++j) { 
      double anotherRandomNumber = dist(gen); 
      // Do whatever you want with generated random number. 
     } 
    } 
} 
+0

これは本当に私が書いたものより速いのですか? –

+0

異なるランで異なる乱数を作成しますか? –

+0

@OliverRangeはい、それはランダムなジェネレータを 'std :: random_device'で毎回シードします。しかし時にはうまくいかない場合もあります。https://stackoverflow.com/questions/18880654/why-do-i-get-the-same-sequence-for-every-run-with-stdrandom-device-with-mingw –

0

使用hereから、このアルゴリズムは:

uint64_t s[2] = { 0x41, 0x29837592 }; 

static inline uint64_t rotl(const uint64_t x, int k) { 
    return (x << k) | (x >> (64 - k)); 
} 

uint64_t next(void) { 
    const uint64_t s0 = s[0]; 
    uint64_t s1 = s[1]; 
    const uint64_t result = s0 + s1; 

    s1 ^= s0; 
    s[0] = rotl(s0, 55)^s1^(s1 << 14); // a, b 
    s[1] = rotl(s1, 36); // c 

    return result; 
} 

double uniform() { 
    return next()*(1.0/18446744073709551616.0); 
} 

これは私のマシン上の例より4倍高速です。

注:s、おそらくstd::random_deviceと入力する必要があります。

+0

あなたは私のケースとしてループのために使用する答えを提供してもらえますか? –

+0

@OliverRange:このコードを自分のものに貼り付け、 'uniform_rand()'を 'uniform()'に置き換えます。 – geza

+0

投稿する場所がわかりません。 mainの後とforループの前に? –

関連する問題