rand()相关表达式不生效:代码逻辑错误在哪里?
问题分析与解决:rand()相关逻辑未生效的原因
核心问题
你遇到的问题并非(double)rand() / RAND_MAX < 0.5这行代码本身失效,而是**cash变量没有在每次外层for循环开始时重置为初始值50**:
- 第一次进入
for循环时,cash从50开始,经过while循环后最终会变成0或250; - 后续999次
for循环中,cash已经处于0或250的状态,cash > 0 && cash < 250的条件直接不成立,while循环完全不会执行,导致后续循环都无法触发随机逻辑,bets只会统计第一次循环的结果,看起来就像随机逻辑没生效; - 当你把随机判断换成常量(比如恒为
true),第一次循环cash会到达250,之后每次for循环cash保持250,bets会累加1000次,看起来“正常运行”,但这其实是另一种逻辑错误。
修正后的代码
#include <stdio.h> #include <stdlib.h> #include <time.h> int main(void) { int bets = 0; srand((unsigned)time(NULL)); for (int i = 1; i <= 1000; i++) { int cash = 50; // 将cash的声明移到for循环内部,每次循环重置为初始值 while (cash > 0 && cash < 250) { if ((double)rand() / RAND_MAX < 0.5) cash++; else cash--; } if (cash == 250) bets++; } printf("initial amount $50\n"); printf("target amount $250\n"); printf("%d wins out of 1000\n", bets); printf("odds of winning=%lf\n", (double)bets / 1000); // 强制转换为double,避免整数除法结果为0 return 0; }
额外细节修正
原代码最后一行的bets / 1000是整数除法,除非bets等于1000,否则结果永远为0,需要强制转换为double才能得到正确的概率值。
内容的提问来源于stack exchange,提问作者rosalinda
相关产品推荐
相关产品推荐

