random是传奇脚本里最核心的概率控制命令,用来做抽奖、爆率、随机事件、随机奖励、随机传送、随机怪物、随机属性。写错位置或理解错概率,就会出现“怎么点都不中”或“每次都中”的错觉。
一、random基础语法
RANDOM 数值
数值是分母,表示1/数值的概率成立。
RANDOM 2
表示50%概率,1/2。
RANDOM 100
表示1%概率,1/100。
RANDOM 1000
表示0.1%概率,1/1000。
random必须写在#IF下面,写在#ACT下面是无效的。正确写法:
#IF
RANDOM 2
#ACT
SENDMSG 6 中奖了
#ELSEACT
SENDMSG 6 没中
二、random在爆率里的真实含义
MonItems里的:
裁决之杖 1/1000
不是random 1000,而是引擎内部用random机制。1/1000的意思是:怪物死亡时,引擎执行一次random 1000,结果为1时掉落裁决。不是杀1000只必出1把,是每只独立计算1/1000。
三、random的常见使用场景
1. 抽奖/NPC转盘
[@抽奖]
#IF
CHECKGOLD 10000
#ACT
TAKE 金币 10000
#IF
RANDOM 10
#ACT
GIVE 屠龙 1
SENDMSG 6 恭喜获得屠龙!
BREAK
#ELSEACT
GIVE 金币 5000
SENDMSG 6 谢谢参与,返还5000金币
BREAK
10%概率出屠龙,90%概率返一半金币。
2. 随机传送
[@随机传送]
#IF
RANDOM 5
#ACT
MAPMOVE 0 <$RANDOMX> <$RANDOMY>
#ELSEACT
MAPMOVE 3 <$RANDOMX> <$RANDOMY>
20%概率传到0号图,80%传到3号图。<RANDOMX> <RANDOMY>是地图内随机坐标。
3. 随机多档奖励
[@开宝箱]
#IF
RANDOM 1000
#ACT
GIVE 屠龙 1
SENDMSG 6 出屠龙了!
BREAK
#IF
RANDOM 100
#ACT
GIVE 裁决之杖 1
SENDMSG 6 获得裁决!
BREAK
#IF
RANDOM 10
#ACT
GIVE 沃玛装备 1
SENDMSG 6 获得沃玛装备
BREAK
#ELSEACT
GIVE 金币 10000
SENDMSG 6 获得10000金币
注意顺序:从最小概率往最大概率写。如果先写RANDOM 10,90%概率直接走else,后面RANDOM 100、1000永远没机会执行。
4. 随机数量
#IF
RANDOM 3
#ACT
GIVE 金币 10000
#IF
RANDOM 3
#ACT
GIVE 金币 10000
#IF
RANDOM 3
#ACT
GIVE 金币 10000
每次独立random 3(33%概率),可能给0、10000、20000、30000金币。
5. 随机属性(HERO/GOM)
#IF
RANDOM 5
#ACT
ChangeHumAbility 0 + 1
SENDMSG 6 攻击+1
BREAK
#IF
RANDOM 5
#ACT
ChangeHumAbility 1 + 1
SENDMSG 6 魔法+1
BREAK
20%概率加攻击,20%概率加魔法。
四、random与变量配合
#IF
RANDOM 100
#ACT
INC P0 1
SENDMSG 6 累积幸运值+1
#IF
LARGE P0 10
#ACT
GIVE 屠龙 1
SET P0 0
SENDMSG 6 幸运值满了,获得屠龙!
用变量记录random失败次数,累积到阈值必给大奖,避免脸黑玩家一直不中。
五、random在机器人脚本里
Robot.txt:
0:30 执行 @随机活动
QuestDiary:
[@随机活动]
#IF
RANDOM 4
#ACT
SENDMSG 0 全服双倍经验开启30分钟!
#ELSEACT
SENDMSG 0 今日无活动,请期待明天
每30分钟有25%概率开启双倍活动。
六、random在怪物刷新里
部分引擎支持MonGen随机刷怪:
3 330 330 5 白野猪 1 10 0 RANDOM 5
表示只有20%概率刷新这只白野猪,常用于稀有BOSS控制。
七、random常见错误
1. 位置写错
#ACT
RANDOM 10
SENDMSG 6 中奖
random在#ACT下,永远成立,每次都“中奖”。
2. 顺序写反
#IF
RANDOM 10
#ACT
GIVE 金币 1000
BREAK
#IF
RANDOM 100
#ACT
GIVE 裁决 1
BREAK
90%概率直接走第一个分支,第二个分支只有10%*10%=1%概率能走到,裁决几乎出不来。
3. 概率理解错
RANDOM 100不是杀100次必出1次,是每次独立1%概率。可能连出10次,也可能500次不出。
4. 与CHECKITEM等条件混用
#IF
CHECKITEM 祝福油 1
RANDOM 10
#ACT
GIVE 屠龙 1
有祝福油且random 10成立才给屠龙,两个条件必须同时满足。
5. 多random叠加
#IF
RANDOM 10
RANDOM 10
#ACT
GIVE 屠龙 1
两个random 10都要成立,实际概率是10%*10%=1%,不是20%。
八、random的高级用法
1. 随机种子控制(部分引擎)
SETRANDOMSEED <$HUMAN(种子)>
RANDOM 100
用玩家变量做种子,保证同一玩家每次random结果可预测,常用于防刷。
2. 随机区间
#IF
RANDOM 100
#ACT
MOV P0 <$RANDOM100>
<$RANDOM100>是0-99的随机数,配合MOV使用。
3. 随机多选项
#IF
RANDOM 4
#ACT
GOTO @奖励1
#IF
RANDOM 4
#ACT
GOTO @奖励2
#IF
RANDOM 4
#ACT
GOTO @奖励3
#ELSEACT
GOTO @奖励4
25%概率走每条分支,实现四选一随机奖励。
九、random在攻城/活动中的应用
[@攻城奖励]
#IF
CHECKCASTLEGOLD
RANDOM 3
#ACT
GIVE 屠龙 1
SENDMSG 0 行会获得屠龙奖励!
#ELSEACT
GIVE 金币 100000
SENDMSG 0 行会获得金币奖励
攻城胜利后33%概率给屠龙,67%给金币。
十、random与服务器性能
大量使用random(如每秒上千次)会消耗CPU,但正常NPC点击、怪物死亡、活动触发级别的random对性能影响微乎其微。避免在Robot每秒循环里无脑random几千次。
十一、各引擎random差异
GOM/GEE:RANDOM 数值,数值范围1-999999
HERO:RANDOM 数值,支持<$RANDOMX>等随机坐标
LEG:RANDOM 数值,老版本可能只支持RANDOM 100以内
翎风/3K:可能有RandomEx、RandomRange等扩展命令
十二、random调试技巧
#IF
RANDOM 2
#ACT
SENDMSG 6 random=1
BREAK
#ELSEACT
SENDMSG 6 random=0
BREAK
用SENDMSG输出结果,验证random是否正常工作。
random的本质是“每次触发时独立计算1/N的概率”,不是累计概率,不是保底机制。写脚本时先想清楚:要的是单次概率、累计概率、还是分段概率,再决定random怎么放、放几个、放什么顺序。概率从大到小写,用变量做保底,避免多random叠加导致概率失控。

