gpt4 book ai didi

c - 如何使用 C/C++ 预处理器生成一系列随机数

转载 作者:行者123 更新时间:2023-12-01 23:34:55 36 4
gpt4 key购买 nike

我想用 C 预处理器生成一系列随机数,并将它们存储在变量中以供我的程序使用。

目标:

我想在每次构建我的程序时生成一组“唯一”的随机数。存储随机数的一小部分变量将被有意义的(即非随机)数字覆盖。我希望黑客不可能通过调试程序或比较多个版本来区分有意义的数字和随机数。我希望构建过程是自动化和独立的。我希望实现可以跨 Visual Studio 和 GCC 移植。

澄清:

  1. 计算必须在编译时完成,而不是在程序执行时完成。调试程序的任何人都应该只能看到,例如,一个变量被初始化为一个常量(随机数)。
  2. 随机数应该是整数。
  3. 随机数生成器应该以某种方式从 __DATE____TIME__ 开始播种,这样不同的构建将产生不同的随机数。
  4. 最好能指定随机数的范围(例如从 1 到 100),但并非绝对必要。
  5. 最好能够指定要生成的随机数的总数(例如,声明 1000 个变量并将每个变量初始化为一个随机数)。

到目前为止的尝试:

  1. 关于预处理器算术的上一个主题:Can the C preprocessor perform integer arithmetic?要点是 #if 条件可以计算算术。
  2. 谷歌搜索表明,除了算术运算之外,移位和位运算也可以通过#if 求值。我已经用 Visual Studio C++ 确认了这一点。
  3. 简单随机数生成器的候选人:http://www.ciphersbyritter.com/NEWS4/RANDC.HTM#369B5E30.65A55FD1@stat.fsu.edu这些生成器中的任何一个,或者任何不可能从给定的随机数系列进行逆向工程的生成器,都可以,因为我不需要性能特别好的生成器。为了便于练习,我们可以使用以下示例:

    unsigned long jcong=380116160;
    #define CONG (jcong=69069*jcong+1234567)
  4. 我认为基本问题是在对生成器的连续调用之间存在存储在变量 jcong 中的状态。据我所知,预处理器不支持变量赋值。也许有一些聪明的递归宏可以做到这一点?

  5. 我能得到的最接近但不满足预处理器执行的目标的是:

    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

关于c - 如何使用 C/C++ 预处理器生成一系列随机数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6498228/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com