我想生成一系列随机数C预处理器,并将它们存储在变量中以供我的程序使用。
目标:
我想在每次构建程序时生成一组“独特”的随机数。存储随机数的变量的一小部分将被有意义的(即非随机)数字覆盖。我希望黑客不可能通过调试程序或比较多个版本来区分有意义的数字和随机数字。我希望构建过程能够自动化且独立。我希望该实现能够跨 Visual Studio 和 GCC 移植。
澄清:
- 计算必须在编译时完成,而不是在程序执行时完成。例如,调试程序的任何人都应该只能看到变量被初始化为常量(随机数)。
- 随机数应该是整数。
- 随机数生成器应该以某种方式从
__DATE__
and __TIME__
,因此不同的构建会产生不同的随机数。
- 最好能够指定随机数的范围(例如从 1 到 100),但不是绝对必要。
- 最好但不是绝对必要的是,能够指定要生成的随机数总数(例如声明 1000 个变量并将每个变量初始化为随机数)。
到目前为止的尝试:
- 上一篇关于预处理器中算术的线程:C 预处理器可以执行整数运算吗? https://stackoverflow.com/questions/1560357/can-the-c-preprocessor-perform-integer-arithmetic要点是#if 条件可以计算算术值。
- 谷歌搜索显示,除了算术运算之外,移位和位运算也可以通过 #if 进行评估。我已经用 Visual Studio C++ 确认了这一点。
-
简单随机数生成器的候选者:http://www.ciphersbyritter.com/NEWS4/RANDC.HTM#[电子邮件受保护] http://www.ciphersbyritter.com/NEWS4/RANDC.HTM#369B5E30.65A55FD1@stat.fsu.edu这些生成器中的任何一个,或者任何不可能从给定的一系列随机数进行逆向工程的生成器都可以,因为我不需要一个表现特别好的生成器。为了进行本练习,我们可以使用以下示例:
unsigned long jcong=380116160;
#define CONG (jcong=69069*jcong+1234567)
我认为基本问题是在对生成器的连续调用之间存在存储在变量 jcong 中的状态。据我所知,预处理器不支持变量赋值。也许有一些聪明的递归宏可以做到这一点?
-
我能得到的最接近但不能满足我由预处理器执行的目标是:
unsigned long jcong=380116160;
unsigned long randomBlock[] = {jcong=69069*jcong+1234567, jcong=69069*jcong+1234567};
我已在 Visual Studio C++ 中确认,这确实将数组成员初始化为不同的随机数。但是,调试器仍会逐步完成初始化。
这是一个纯粹的编程/实现问题,所以请不要劝说预处理器的邪恶或对抗黑客的徒劳。
因此,这是接近要求的解决方案:
// pprand.h
#include <boost/preprocessor/slot.hpp>
#ifndef PP_RAND_SEED
#define PP_RAND_SEED (((PP_RAND_MIN + PP_RAND_MAX) * 0x1f7) ^ 0x1e3f75a9)
#endif
#define BOOST_PP_VALUE ((PP_RAND_SEED * 214013 + 2531011) % 65536)
#include BOOST_PP_ASSIGN_SLOT(1)
#undef BOOST_PP_VALUE
#undef PP_RAND_SEED
#define PP_RAND_SEED BOOST_PP_SLOT(1)
#define BOOST_PP_VALUE (PP_RAND_MIN + PP_RAND_SEED % (PP_RAND_MAX - PP_RAND_MIN))
#include BOOST_PP_ASSIGN_SLOT(2)
#undef BOOST_PP_VALUE
#ifdef PP_RAND
#undef PP_RAND
#endif
#define PP_RAND BOOST_PP_SLOT(2)
你可以这样使用它:
// Pseudo random number range.
#define PP_RAND_MIN 0
#define PP_RAND_MAX 100
// Pseudo random number seed.
#define PP_RAND_SEED 123
#include "pprand.h"
// Got it!
#pragma message("PP_RAND value:" _CRT_STRINGIZE(PP_RAND))
要了解有关此方法的更多信息,请访问我的博客:http://alexander-stoyan.blogspot.com/2012/07/getting-pseudo-random-numbers-at.html http://alexander-stoyan.blogspot.com/2012/07/getting-pseudo-random-numbers-at.html
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)