簡體   English   中英

在main之外和變量聲明之前調用srand

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM