如何生成3个取值1-100、总和为200的随机整数以初始化玩家属性
解决方案
原代码问题
- 当生命值与攻击力之和小于100时,防御力取1~100随机值,最终三个属性总和必然小于200,不满足要求
- 未对防御力的取值范围做约束,存在超出1~100区间的风险
实现逻辑
要同时满足三个属性均为1~100的整数、总和为200的要求,只需约束前两个属性的随机范围,第三属性直接计算即可:
- 先随机生成1~100之间的生命值
- 推导攻击力的合法取值区间:要保证最终计算出的防御力也在1~100之间,攻击力的下限为
max(1, 100 - 生命值),上限为min(100, 199 - 生命值) - 在合法区间内随机生成攻击力
- 直接用200减去生命值和攻击力得到防御力,自动满足数值范围和总和要求
修复后代码
public function initPlayer(){ // 随机生成生命值:1~100 $life = random_int(1, 100); // 计算攻击力的合法取值范围 $attackMin = max(1, 100 - $life); $attackMax = min(100, 199 - $life); // 在合法范围内随机生成攻击力 $attack = random_int($attackMin, $attackMax); // 计算防御力,自动满足1~100且总和为200 $defense = 200 - $life - $attack; echo $life . '-' . $attack . '-' . $defense; }
内容的提问来源于stack exchange,提问作者SlimBoy Fat
相关产品推荐
相关产品推荐

