使用C预处理器生成随机数

时间:2011-03-18 16:57:10

标签: random c-preprocessor

我想使用 C 预处理器生成一个随机数或字符串...嗯...我甚至不知道这是否可行,但我试图创建变量fly(字符串在这里会很有用)并为它们赋值(整数)。所以我想尝试一些事情,但基本问题仍然存在 - 我可以使用预处理器创建一个随机字符串或数字。

3 个答案:

答案 0 :(得分:16)

基于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

答案 1 :(得分: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只能生成大数而不是标识符令牌。

答案 2 :(得分:-7)

不要在C中这样做。你最终会让人感到困惑。如果您需要动态创建变量,请使用mallocrealloc并维护其值的数组。

要回答你的问题,不。预处理器不包括随机数生成器。您可以在运行时生成随机数(使用rand()),但如果您在编译时确实需要它们,则必须编写自己的预处理器并通过它运行代码。或者你可以使用4,这是由一个公平的100面模具随机确定的。