广告广告
  加入我的最爱 设为首页 风格修改
首页 首尾
 手机版   订阅   地图  繁体 
您是第 203 个阅读者
 
发表文章 发表投票 回覆文章
  可列印版   加为IE收藏   收藏主题   上一主题 | 下一主题   
冷场馆女仆长 会员卡
个人头像
个人文章 个人相簿 个人日记 个人地图
特殊贡献奖
头衔:一位兴趣使然的伺服主一位兴趣使然的伺服主
特约版主
级别: 特约版主 该用户目前不上站
版区: CS教学区
推文 x200 鲜花 x478
分享: 转寄此文章 Facebook Plurk Twitter 复制连结到剪贴簿 转换为繁体 转换为简体 载入图片
推文 x0
[插件] 一些关于 native random() 实用公式  (可令random()抽正负数、小数等等)

图 1. 附一张图文不符的图   
附一张图文不符的图



相信大家稍微看过AMXX函数的也会知道,
AMXX有三种函数可以生成随机数字:
复制程式
native random(max)  //可以抽取 0 至 (max - 1)  范围内的整数

native Float:random_float(Float:a, Float:b);  // 可以抽取 a 至 b 范围内的小数

native random_num(a, b)  // 可以抽取 a 至 b  范围内的正负整数
乍看一下没啥分别也是产生随机数字
但其实两者在运作上不相同:
random_float 、random_num是直接向引擎获取随机数
而random()则是使用AmxModx内置生成随机数

你问我知道这些有啥用? 呃,没错的确听起来没啥用表情
不过既然两者实现方式不同,那执行速度上可能就有差别喔...?表情
以下是使用分析器分别执行10000次测试出来:
random(20) time :
0.000093187176
0.000094055468
0.000090957132

random_num(0,20) time :
0.000162057616
0.000242643696
0.000160149244

random_float(0.0,20.0) time:
0.000151322136
0.000199439368
0.000146716752
从结果可见,同样是抽取0至20范围内的数字, random() 整体在速度上会比 random_num() 快表情
如果你喜欢运行速度快(即使你完全体感不出来表情),你可能会想选择用random() 表情

-----------------------------------------

但random()只能抽「 0 至 max-1」的条件下,会有许多情况下也不适用,表情
所以在这分享一些从网上找到的公式,令 random() 整体实用性提升表情:

random_chance
复制程式
#define random_chance(%0) (%0 > random(100))
random_chance(25) 执行10000次的速度 :
0.000096780092
0.000096626784
0.000093949460
检查机率百分比,若抽中了会回传1,反之则回传0,
由于不需运算所以效能跟本身 random() 几乎没差别

random_fastgetnum
复制程式
#define random_fastgetnum(%0,%1) (random(%1 - %0 + 1) + %0)
random_fastgetnum(0,20) 执行10000次的速度 :
0.000091732720
0.000110157688
0.000091345996
可以抽取 %0 至%1 范围内的数字,但只限正整数

random_sighnum
复制程式
#define random_sighnum(%0) (random(2 * %0 + 1) - %0)
random_sighnum(20) 执行10000次的速度 :
0.000106322552
0.000105548456
0.000127152180
可以抽取 0 至 %0 范围内的数字,并会随机将数字转为正数或负数


random_getnum
复制程式
#define random_getnum(%0,%1) (%0 + (random(RAND_MAX) % (%1 - %0 + 1)))
random_getnum(-20,20) 执行10000次的速度 :
0.000149931260
0.000141040200
0.000122050440
相比random_fastgetnum,这个可以抽取 %0 至%1 范围内的正负整数,
所以用途很广泛,但因要进行% 运算所以执行速度较慢 (接近random_num所需效能)
如果你是以效能优先,建议跟 random_fastgetnum、random_sighnum 灵活配合运用

random_slowgetnum
复制程式
#define random_slowgetnum(%0,%1) (floatround(((float(random(RAND_MAX)) / float(RAND_MAX) * (%1 - %0 + 1)) + %0), floatround_floor))
random_slowgetnum(-20,20) 执行10000次的速度 :
0.000478622104
0.000423543492
0.000444157876
这个可以抽取 %0 至%1 范围内的正负整数,
但由于需进行不少浮点数运算,所以执行速度是所有公式之中最慢,
唯一好处是由于将要抽的数字拆分成0.0至1.0小数,然后再运算得出范围内的整数,
所以"可能"体感上抽取数字会更均匀一点,
就好像 random(2) 和 (random(50) > 25) 体感上后者数字更随机,即使机率一样,
除非有特别需求,否则整体上建议使用random_getnum就好

randomf
复制程式
#define randomf(%0) (Float:((float(random(RAND_MAX)) / float(RAND_MAX)) * Float:%0))
randomf(20.0) 执行10000次的速度 :
0.000258840008
0.000240448800
0.000254451900
可以抽取 0至 %0 范围内的小数,但因为要进行浮点数除法,
所以会被原生random_float慢,
要不要使用就自己衡量,这里只提供给大家参考用

random_getfloat
复制程式
#define random_getfloat(%0,%1) (Float:(float(random(RAND_MAX)) / float(RAND_MAX) * (Float:%1 - Float:%0)) + Float:%0)
random_getfloat(0.0,20.0) 执行10000次的速度 :
0.000356375972
0.000366431980
0.000398652484
可以抽取 %0至%1 范围内的小数
但缺点同上,同样只提供给大家参考用

--------------------------------------------------------

如果你看完对random()有兴趣想试试看,表情
你可以下载附件random.inc,
在自己源码加上#include <random>便可使用上面的define了~表情


本帖包含附件
zip random inc.zip   (2025-05-03 14:30 / 2 KB)   下载次数:0


[ 此文章被冷场馆女仆长在2025-05-03 15:06重新编辑 ]



我只是一个兴趣使然的Server主.
献花 x0 回到顶端 [楼 主] From:未知地址 | Posted:2025-05-03 14:25 |

首页  发表文章 发表投票 回覆文章
Powered by PHPWind v1.3.6
Copyright © 2003-04 PHPWind
Processed in 0.023955 second(s),query:15 Gzip disabled
本站由 瀛睿律师事务所 担任常年法律顾问 | 免责声明 | 本网站已依台湾网站内容分级规定处理 | 连络我们 | 访客留言