【发布时间】:2012-03-06 16:47:43
【问题描述】:
我想做一些有点邪恶的事情。我想重新定义 for 循环来修改条件。有没有办法做到这一点?
根据 GCC 文档,支持重新定义关键字:http://gcc.gnu.org/onlinedocs/cpp/Macros.html
我想做的是为 C++ 做一个“概率”包装器,看看我是否可以用它做任何有趣的事情。
#include <iostream>
#include <cstdlib>
#define P 0.85
#define RANDOM_FLOAT ((float)rand()/(float)RAND_MAX)
#define RANDOM_CHANCE (RANDOM_FLOAT < P)
#define if(a) if((a) && RANDOM_CHANCE)
#define while(a) while((a) && RANDOM_CHANCE)
// No more for loops or do-while loops
#define do
#define goto
// Doesn't work :(
//#define for(a) for(a) if(!RANDOM_CHANCE) { break; }
int main() {
srand(time(NULL));
//Should output a random list of Y's and N's
for(int i=0; i < 100; ++i) {
if(i < 100) {
std::cout << "Y";
} else {
std::cout << "N";
}
}
std::cout << std::endl;
// Will loop for a while then terminate
int j = 0;
while(j < 100) {
++j;
std::cout << j << "\n";
}
std::cout << std::endl;
return 0;
}
也许更合理的用途是计算正在运行的程序中的循环迭代次数,例如通过映射
for(int i=0; i < 10; ++i)
到
for(int i=0; i < 10; ++i, ++global_counter)
有可能完成我想做的事情吗?
编辑:感谢您的回复 - 我真的很感激!
我可以用这个做的一件事是模拟一个公平的硬币(有效地强制 P 为 0.5),注意如果你有一个有偏见的硬币,Pr(HT) == Pr(TH)。我没有发现这个技巧,但它很有用。这意味着您可以近似 P 的任何概率分布。
bool coin() {
bool c1 = false;
bool c2 = false;
if(true) {
c1 = true;
}
if(true) {
c2 = true;
}
//If they have different faces.
bool valid = (c1 && !c2) || (!c1 && c2);
bool result = c1;
if(valid) { return result; }
return coin();
}
【问题讨论】:
-
这太棒了...在很多不同的级别上...
-
如果其他人可能需要维护您的代码,请确保他们不知道您住在哪里。
-
我保证这不会在生产中结束。大概吧。
标签: c++ c-preprocessor