2016-05-05 9 views
3

自分のプログラムでrand()を使う必要がありますが、それはクラスで呼び出され、作成するオブジェクトはグローバルスコープにある必要がありますので、srandメインとグローバルスコープの前に()は方法がありますか?同じ翻訳単位で宣言さmainと変数宣言の前でsrandを呼び出す

#include <stdlib.h> 
#include <iostream> 
#include <time.h> 
#include "Electron.h" 

srand(time(0)); 
Electron el1; 
Electron el2; 
Electron el3; 
Electron el; 


int main(int argc, char** argv){ 
    ... 
} 

答えて

1

my_randの呼び出し。

randの代わりにmy_randを使用してください。


他のニュースで:

  • グローバル変数は™悪です。
    目に見えないデータの流れや影響をもたらし、プログラム内で何が起こっているのかを理解することが難しくなります。

  • C++ 11は、randよりも優れたランダムジェネレータを導入しました。
    しかし、もっと複雑です。私はここで私の頭からそれらの名前をつけることさえできません、私はそれらを見なければならないでしょう。しかし、私はあなたがそれを行う価値があると思います。

  • timeは、エントロピーの不安定な原因です。
    <chrono>からの高解像度クロックははるかに良いでしょう。それ以外の場合は、ほぼ同じ時間(1秒以内)に開始するランについて同じシードが発生する可能性があります。

+0

ありがとう、私は電子クラスでmy_randを呼び出すことはできませんか、間違っていますか? – apz2000

+1

あなたは*そのクラスで*呼び出すことはありません。それは意味のあるフレーズではありません。あなたはそのクラスのコードから呼び出します。 –

4

グローバルスコープのオブジェクトが宣言されている順序で構築されます。したがって、スタブクラスを宣言し、そのコンストラクタにsrand()を呼び出すことができます。あなたは、この場合のみ、srand()は、この翻訳単位でグローバルスコープの前に呼び出される、ことを保証しているように、異なる翻訳単位でのグローバルスコープのオブジェクトの建設の順序は、指定されていないが

class invoke_srand { 
public: 
    invoke_srand() 
    { 
     srand(time(0)); 
    } 
}; 

static invoke_srand do_invoke_srand; 

Electron el1; 
Electron el2; 
Electron el3; 
Electron el; 

取得他の翻訳単位のグローバルスコープオブジェクトの構築順序については保証されていません。

auto my_rand() 
    -> int 
{ 
    static bool const dummy = (srand(time(0)), true); 
    return rand(); 
} 

ここdummyは、最初に、一度だけ初期化されます:srandにかかわらず、で翻訳単位の、あなたがこれを行うことができ、randのいずれかの呼び出しの前に一回呼び出されていることを確認するために

+1

クラスを定義する必要はありません(クリーンアップが必要な場合は別です)。たとえば'bool const dummy =(srand(time(0))、true);'。 –

+0

さて、あなたはこのように貴重なRAMのバイトを無駄にします。実際、RAMはこれまでよりもずっと安いですが、貴重なバイトが無駄になるのを見逃すことになります。 –

+1

無駄はありません。それはあなたの誤解です。したがって、クラスは**未熟な最適化**です。そして、悪いことに、想像された問題が存在しないため、問題を解決しない早すぎる最適化です。 –

関連する問題