传奇脚本关于Random机率算法详细说明

20210320新增:今天发现Random后面只能是数值,不能是变量如P N之类的变量(用movr做几率脚本 精准度可以做到无限小数点,看最下面脚本实例)

说明:Random 是一个随机标签,一般用于判定脚本里,#if的下面,当然这个标签也用在新爆率文件里,可以查看我写的一篇关于爆率的文章,这里就不多讲了

格式:Random 数值(数值与爆率文件里的数值机率类同)

举例:Random 10(这就表示1/10的概率)

大家在修改或编写脚本时经常会用到Random这个标签,格式和用法我这里不多讲,主要是讲一下机率的算法以及详细百分比的脚本是如何实现的

先给大家看个实例:以中奖为例吧
;—————————————-
[@main]
#If
Random 2
#Act
give 礼包 1
SendMsg 7 恭喜您,获得礼包,中奖机率是50%
#ElseAct
SendMsg 7 对不起!没获得礼包!
break
;—————————————-
以上面的实例来展开其中的机率算法。

Random 2(也就是1/2,机率就是50%)

那我们来运算一下从1%-100%的机率算法,并以脚本来实现(会有小部分误差)

▓▓▓▓▓▓▓第一种方法,正向算法

Random 1(也就是1/1,机率就是100%)

Random 2(也就是1/2,机率就是50%)

Random 3(也就是1/3,机率就是33.33%)

Random 4(也就是1/4,机率就是25%)

Random 5(也就是1/5,机率就是20%)

Random 6(也就是1/6,机率就是16.67%)

Random 7(也就是1/7,机率就是14.29%)

Random 8(也就是1/8,机率就是12.5%)

Random 9(也就是1/9,机率就是11.11%)

Random 10(也就是1/10,机率就是10%)

Random 20(也就是1/20,机率就是5%)

Random 30(也就是1/20,机率就是3.33%)

Random 40(也就是1/20,机率就是2.5%)

Random 50(也就是1/20,机率就是2%)

Random 60(也就是1/20,机率就是1.67%)

Random 70(也就是1/20,机率就是1.43%)

Random 80(也就是1/20,机率就是1.25%)

Random 90(也就是1/20,机率就是1.11%)

Random 100(也就是1/20,机率就是1%)

以是概率从1%-100%百分比值,但是大家看到还有许多缺失是吧

▓▓▓▓▓▓▓第二种方法:反向算法

把上面机率脚本用#ElseAct反过来写一遍是不是多了将近一半的百分比值,这叫反向算法

例如:90%的获得礼包机率怎么写脚本,我就把10%中奖概率写成10%不中,不就成了90%了吗!
;—————————————-
[@main]
#If
Random 10
#Act
SendMsg 7 对不起!没获得礼包!
#ElseAct
give 礼包 1
SendMsg 7 恭喜您,获得礼包,中奖机率是90%
break
;—————————————-

那么正面中奖率百分比值有(100%、50%、25%、20%、10%等)

那么反面中奖率百分比值有(90%、80%、75%、50%、等)

我们用了第一种方法获得了百分比,但还是不全,这样我们就用第三种方法来补一下缺,拆分算法:百分比相加或相减法

▓▓▓▓▓▓▓第三种方法:拆分算法

▓相加算法:就是需要50%以上的百分比用正向算法的脚本去实现
;—————————————-
[@main]
#If
Random 2
#Act
give 礼包 1
SendMsg 7 恭喜您,获得礼包,中奖机率是75%
break
#If
Random 2
#Act
give 礼包 1
SendMsg 7 恭喜您,获得礼包,中奖机率是75%
#ElseAct
SendMsg 7 对不起!没获得礼包!
break
;—————————————-
看明白了吗?,第一次用50%机率去执行,中了停止脚本,没中继续来一次,机率还是50%;

原理:我们玩过用硬币抛正反面的游戏,抛到正面为赢,如果抛一次机率就是50%,如果给你两次机率,只要抛到正面就赢,这样我们的赢的机率75%了

抛两次的排列结果是:正正,反正、正反、反反。只要两次都不是反面就赢,是不是75%

▓相减算法:就是需要50%以下的百分比用反向算法的脚本去实现
;—————————————-
[@main]
#If
Random 2
#Act
SendMsg 7 对不起!没获得礼包!
break
#If
Random 2
#Act
give 礼包 1
SendMsg 7 恭喜您,获得礼包,中奖机率是25%
#ElseAct
SendMsg 7 对不起!没获得礼包!
break
;—————————————-
这次注意看脚本,第一次用50%机率去执行,没中奖停止脚本,中将继续来一次,机率还是50%;

同样抛硬币游戏两次的排列结果是:正正,反正、正反、反反。必需两次都为正才赢,是不是只有25%

拆分算法:所谓拆分算法就是用简单的百分比去相加或相减

所以通过以下几种方法,最后给出大家以5的倍数的百分比的脚本
;—————————————-100%
[@main]
#If
Random 1
#Act
SendMsg 7 恭喜您,获得礼包,中奖机率是:100%
break
;—————————————-95%
[@main]
#If
Random 20
#Act
SendMsg 7 对不起!没获得礼包!
break
#ElseAct
SendMsg 7 恭喜您,获得礼包,中奖机率是:95%
break
;—————————————-90%
[@main]
#If
Random 10
#Act
SendMsg 7 对不起!没获得礼包!
break
#ElseAct
SendMsg 7 恭喜您,获得礼包,中奖机率是90%
break
;—————————————-85%=80+5
[@main]
#If
Random 5
#Act
#ElseAct
SendMsg 7 恭喜您,获得礼包,中奖机率是85%
break
#If
Random 4
#Act
SendMsg 7 恭喜您,获得礼包,中奖机率是85%
break
#ElseAct
SendMsg 7 对不起!没获得礼包!
break
;—————————————-80%
[@main]
#If
Random 5
#Act
SendMsg 7 对不起!没获得礼包!
break
#ElseAct
SendMsg 7 恭喜您,获得礼包,中奖机率是80%
break
;—————————————-75%
[@main]
#If
Random 4
#Act
SendMsg 7 对不起!没获得礼包!
break
#ElseAct
SendMsg 7 恭喜您,获得礼包,中奖机率是75%
break
;—————————————-70%=50+10+10
[@main]
#If
Random 2
#Act
SendMsg 7 恭喜您,获得礼包,中奖机率是70%
break
#If
Random 5
#Act
#ElseAct
SendMsg 7 恭喜您,获得礼包,中奖机率是70%
break
#If
Random 4
#Act
SendMsg 7 恭喜您,获得礼包,中奖机率是70%
break
#ElseAct
SendMsg 7 对不起!没获得礼包!
break

;—————————————-60%=50+10
[@main]
#If
Random 2
#Act
SendMsg 7 恭喜您,获得礼包,中奖机率是60%
break
#If
Random 5
#Act
SendMsg 7 恭喜您,获得礼包,中奖机率是60%
break
#ElseAct
SendMsg 7 对不起!没获得礼包!
break
;—————————————-55%=50+5
[@main]
#If
Random 2
#Act
SendMsg 7 恭喜您,获得礼包,中奖机率是55%
break
#If
Random 10
#Act
SendMsg 7 恭喜您,获得礼包,中奖机率是55%
break
#ElseAct
SendMsg 7 对不起!没获得礼包!
break
;—————————————-50%
[@main]
#If
Random 2
#Act
SendMsg 7 恭喜您,获得礼包,中奖机率是50%
break
;—————————————-45%=50-5
[@main]
#If
Random 2
#Act
SendMsg 7 对不起!没获得礼包!
break
#If
Random 10
#Act
SendMsg 7 对不起!没获得礼包!
break
#ElseAct
SendMsg 7 恭喜您,获得礼包,中奖机率是45%
break
;—————————————-40%=50-10
[@main]
#If
Random 2
#Act
SendMsg 7 对不起!没获得礼包!
break
#If
Random 5
#Act
SendMsg 7 对不起!没获得礼包!
break
#ElseAct
SendMsg 7 恭喜您,获得礼包,中奖机率是40%
break
;—————————————-35%=50-10-5
[@main]
#If
Random 2
#Act
SendMsg 7 对不起!没获得礼包!
break
#If
Random 5
#Act
SendMsg 7 对不起!没获得礼包!
break
#If
Random 12
#Act
SendMsg 7 对不起!没获得礼包!
#ElseAct
SendMsg 7 恭喜您,获得礼包,中奖机率是30%
break
;—————————————-30%=50-10-10
[@main]
#If
Random 2
#Act
SendMsg 7 对不起!没获得礼包!
break
#If
Random 5
#Act
SendMsg 7 对不起!没获得礼包!
break
#If
Random 6
#Act
SendMsg 7 对不起!没获得礼包!
#ElseAct
SendMsg 7 恭喜您,获得礼包,中奖机率是30%
break
;—————————————-25%
[@main]
#If
Random 4
#Act
SendMsg 7 恭喜您,获得礼包,中奖机率是25%
break
#ElseAct
SendMsg 7 对不起!没获得礼包!
break
;—————————————-20%
[@main]
#If
Random 5
#Act
SendMsg 7 恭喜您,获得礼包,中奖机率是20%
break
#ElseAct
SendMsg 7 对不起!没获得礼包!
break
;—————————————-15%
[@main]
#If
Random 5
#Act
#ElseAct
SendMsg 7 对不起!没获得礼包!
break
#If
Random 16
#Act
SendMsg 7 对不起!没获得礼包!
break
#ElseAct
SendMsg 7 恭喜您,获得礼包,中奖机率是15%
break
;—————————————-10%
[@main]
#If
Random 10
#Act
SendMsg 7 恭喜您,获得礼包,中奖机率是10%
break
#ElseAct
SendMsg 7 对不起!没获得礼包!
break
;—————————————-5%
[@main]
#If
Random 20
#Act
SendMsg 7 恭喜您,获得礼包,中奖机率是5%
break
#ElseAct
SendMsg 7 对不起!没获得礼包!
break
;—————————————-1%
[@main]
#If
Random 100
#Act
SendMsg 7 恭喜您,获得礼包,中奖机率是1%
break
#ElseAct
SendMsg 7 对不起!没获得礼包!
break
;—————————————-

用movr做随机数,精确度非常准,Random太坑,做个简的还行下面是实例和逻辑

[@main]
#if
#act
mov N$中奖率 70 ;【解释:设置中奖率70%】
movr P10 100 ;【解释:定义P10变量,从0-99随机一个数值】

#If
Small P10 <s t r ( N str(Nstr(N中奖率)> ;【解释:判定P10变量值,是否小于中奖率,如果小于中奖,大于等于70则没中奖】
#Act
SendMsg 7 恭喜您,获得礼包,中奖机率是70% break
#ElseAct
SendMsg 7 对不起!没获得礼包! break

怎么样,是不是1-100中奖率都可以写出来,脚本就这么一点点搞定!!
如果你要做到千分比,那么就在下面两什定义值多加个零,是不是就成千分比了

mov N$中奖率 7 ;【解释:设置中奖率 0.7%】
movr P10 1000 ;【解释:定义P10变量,从0-999随机一个数值】
————————————————
版权声明:本文为CSDN博主「dafei5210」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/dafei5210/article/details/112885666

发表回复

后才能评论