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

