2011-03-18 62 views
9

我想生成一個隨機數字或字符串使用C預處理器......恩......我甚至不知道這是否可能,但我試圖即時創建變量(字符串在這裏很有幫助)併爲它們賦值(整數)。所以我正在嘗試做一些事情,但基本問題仍然存在 - 我可以使用預處理器創建一個隨機字符串或數字。使用C預處理器生成一個隨機數

+1

簡而言之:無。你將不得不寫一個你自己的簡單預處理器。不要忘了設計一種方式來測試你的隨機源代碼。 – 2011-03-18 16:59:38

+1

你見過這個嗎? http://www.ciphersbyritter.com/NEWS4/RANDC.HTM'1999-01-15 Jeff Stout' – 2011-03-18 17:01:58

+5

你真的需要*隨機*還是你只需要*獨特*?如果後者可能使用'__LINE__'來創建唯一的變量名稱? – 2011-03-18 17:29:20

回答

12

我想問你是否想通過預處理器創建唯一標識符標記。

gcc有一個名爲__COUNTER__的擴展名,它的名字就是你期望的。您可以將其與宏連接##組合以獲取唯一標識符。

如果你有一個C99編譯器,你可以使用P99。它有稱爲P99_LINEIDP99_FILEID的宏。它們可以用作

#include "p99_id.h" 

P99_LINEID(some, other, tokens, to, make, it, unique, on, the, line) 

並且類似地用於P99_FILEID

第一次從您的令牌中調出一個名稱,並且行號和散列值取決於包含文件「p99_id.h」的次數。第二個宏只是使用該散列而不是行號,這樣名稱就可以在同一編譯單元中的多個位置重現。

這兩個宏也有對應的P99_LINENOP99_FILENO,它們只是產生大量的數字而不是標識符標記。

+0

非常好的迴應! – Xofo 2015-05-27 17:45:22

+2

是不是'__COUNTER__'的擴展? https://gcc.gnu.org/onlinedocs/cpp/Common-Predefined-Macros.html – Kupiakos 2015-08-06 04:28:58

+1

@ Kupiakos,你是對的,謝謝! – 2015-08-06 11:19:56

-5

不要在C中這樣做。最終會讓人困惑。如果您需要隨時創建變量,請使用mallocrealloc並保留其值的數組。

要回答你的問題,沒有。預處理器不包含隨機數生成器。您可以在運行時生成隨機數(使用rand()),但如果您在編譯時確實需要它們,則必須編寫自己的預處理器並通過它運行代碼。或者你可以使用4,這是由一卷公平的100面骰子隨機決定的。

15

基於1999-01-15 Jeff Stout(感謝@ rlb.usa)

#define UL unsigned long 
#define znew ((z=36969*(z&65535)+(z>>16))<<16) 
#define wnew ((w=18000*(w&65535)+(w>>16))&65535) 
#define MWC (znew+wnew) 
#define SHR3 (jsr=(jsr=(jsr=jsr^(jsr<<17))^(jsr>>13))^(jsr<<5)) 
#define CONG (jcong=69069*jcong+1234567) 
#define KISS ((MWC^CONG)+SHR3) 
/* Global static variables: 
    (the seed changes on every minute) */ 
static UL z=362436069*(int)__TIMESTAMP__, w=521288629*(int)__TIMESTAMP__, \ 
    jsr=123456789*(int)__TIMESTAMP__, jcong=380116160*(int)__TIMESTAMP__; 


int main(int argc, _TCHAR* argv[]){ 
    cout<<KISS<<endl; 
    cout<<KISS<<endl; 
    cout<<KISS<<endl; 
} 

輸出:

247524236 
3009541994 
1129205949 
+0

嵌入式系統的很好的實現。兩個答案都很好。 – Xofo 2015-05-27 17:45:43