【问题标题】:Generate a random number using the C Preprocessor使用 C 预处理器生成随机数
【发布时间】:2011-07-18 08:08:45
【问题描述】:

我想使用 C 预处理器生成一个随机数或字符串……嗯……我什至不知道这是否可能,但我正在尝试在苍蝇(字符串在这里会很有帮助)并为它们分配值(整数)。所以我正在尝试做一些事情,但基本问题仍然存在 - 我可以使用预处理器创建一个随机字符串或数字吗?

【问题讨论】:

  • 简而言之:没有。您将不得不自己编写一个简单的预处理器。不要忘记设计一种方法来测试您的随机源代码。
  • 你见过这个吗? ciphersbyritter.com/NEWS4/RANDC.HTM1999-01-15 Jeff Stout
  • 你真的需要 random 还是只需要 unique ?如果是后者,那么可以使用__LINE__ 创建唯一的变量名?
  • 我认为 Paul 确定了 OP 真正想要做的事情。

标签: random c-preprocessor


【解决方案1】:

我接受您的问题,您希望有一种通过预处理器创建唯一标识符令牌的方法。

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,它们只生成大数字而不是标识符标记。

【讨论】:

  • 想补充一点,__COUNTER__ 也可用于其他编译器,例如MSVC。请注意,__COUTER__ 仅对于预处理器当前正在解析的文件是唯一的(对于每个解析的源文件,它都以 0 开头)。
【解决方案2】:

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

【讨论】:

  • 非常好的嵌入式系统实现。两个答案都很好。
  • 这是什么意思:“种子每分钟都在变化”?什么事件改变了它?
  • @user10133158 __TIMESTAMP__ 是一个精度为 1 分钟的编译器变量。所以,你编译的每一分钟,种子都会改变
  • 这是误导性的,因为它没有按照 OP 的要求使用预处理器来计算随机数。相反,它会插入一个 C 代码块,该代码块将被编译成计算数字的代码。
  • @ScottJ 不,代码处于预处理阶段
猜你喜欢
  • 2011-09-23
  • 1970-01-01
  • 1970-01-01
  • 2011-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多