醉汉随机步行模拟代码异常:始终输出100步求助排查
问题分析与修复
核心问题:整数除法导致概率逻辑完全失效
代码里两处整数除法错误直接让随机移动逻辑彻底失效:
rand() / RAND_MAX:rand()和RAND_MAX都是整数类型,整数除法会直接舍弃小数部分。除非rand()恰好等于RAND_MAX,否则结果永远是0,这一情况几乎不会发生,所以randomnum的值几乎始终为0。1/3:同样是整数除法,结果直接为0,导致randomnum < 0的判断永远不成立,醉汉每次只会执行position +=1,从0到100刚好走100步,所以输出固定为100。
修复后的代码
#include <iostream> #include <cstdlib> #include <ctime> using namespace std; int randomStep(int position); int main() { srand(time(NULL)); int position = 0, countSteps = 0; const int HOME = 100; do { position = randomStep(position); countSteps++; } while (position < HOME); cout << "No of Steps to reach home : " << countSteps << endl; return 0; } int randomStep(int position) { // 转换为浮点数除法,生成0.0到1.0之间的随机数 double randomnum = static_cast<double>(rand()) / RAND_MAX; // 用浮点数计算概率阈值,避免整数除法问题 if (randomnum < 1.0/3.0) { position -= 1; } else { position += 1; } return position; }
关键修复点
- 将
rand()强制转换为double后再除以RAND_MAX,得到0.0到1.0之间的有效浮点数随机值。 - 用
1.0/3.0代替1/3,确保得到正确的概率阈值(约0.333),让1/3后退、2/3前进的逻辑生效。
修改后,醉汉会按照设定的概率随机移动,步数结果将符合随机游走的预期,不再固定为100。
内容的提问来源于stack exchange,提问作者Damien Torres
相关产品推荐
相关产品推荐

