![](/img/trans.png)
[英]In function overloading the order of function call differs in function declaration in case of outside and inside the main function
[英]Call srand outside main and before variable declaration
我需要在我的程序上使用rand(),但事實是它在類上調用,我創建的對象需要在全局范圍內,所以我需要在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){
...
}
在相同翻譯單元中聲明的全局范圍對象將按其聲明的順序構造。 因此,您可以聲明一個存根類,並讓其構造函數調用srand
()。
class invoke_srand {
public:
invoke_srand()
{
srand(time(0));
}
};
static invoke_srand do_invoke_srand;
Electron el1;
Electron el2;
Electron el3;
Electron el;
但是,在不同的轉換單元中構造全局范圍對象的順序是未指定的,因此您只能保證在這種情況下,在構建此轉換單元的全局作用域之前調用srand()
,並且不保證其他翻譯單元中全局范圍對象的構造順序。
為了確保在任何rand
調用之前一次調用srand
,無論在哪個翻譯單元中,你都可以這樣做:
auto my_rand()
-> int
{
static bool const dummy = (srand( time( 0 ) ), true);
return rand();
}
在my_rand
的第一次調用中, dummy
將被初始化一次。
所以只需使用my_rand
而不是直接使用rand
。
在其他新聞中:
全局變量是Evil™。
它們引入了無形的數據流和影響線,使得很難理解程序中發生了什么。
C ++ 11引入了比rand
更好的隨機生成器。
但是,它們更復雜。 我甚至不能在這里把它們命名為我,我必須查看它們。 但是如果你正在進行模擬,我認為你會發現它是值得的。
time
是熵的不良來源。
來自<chrono>
高分辨率時鍾會好得多。 否則,對於大致在同一時間(一秒鍾內)開始的運行,您冒着相同的種子風險。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.