一、需求
目前存在一个需求,提供一个随机数的函数,这个函数的最小和最大值之间的精度是不等的,取他们中间的一个随机数,使用Lua自带的方法是做不到的,需要自己封装一个函数来使用。
二、解决
Lua本身的限制
Lua取随机数目前只有三种方式。
local result = math.random() -- 返回一个0 ~ 1之间的随机小数
local result = math.random(100) -- 返回1 ~ 100之间的随机整数
local result = math.random(10,100) -- 返回10 ~ 100之间的随机整数
解决思路
我先寻找了一下Lua有没有取数字精度的api,发现没有。那么就要首先搞到一个取精度的方式
本意并不想使用字符串来处理,但是想来想去也没有想到更加简便的处理方式了。如果有更加优雅的实现方式,也可以在评论区告诉我。
先搞了一个分割字符串的函数,然后把数字转化成字符串用字符’.'(小数点)来分割。这样取到的表[2]一定是小数部分。没有取到[2]就说明这是一个整数。
接下来要以精度最高的数作为基准数字来处理。因为Lua取随机小数只有math.random(),并且范围是0~1,所以可以使用max和min之间的差值乘上这个值即可取得随机值,这个值再加上min就是想要获得的随机值。
但是这时候会出现一个问题,就是精度问题。math.random()取到的数精度很高,我在代码里对精度进行了取余然后四舍五入的运算,这样可以保证小数点精度一致性。
最终获得的值,经过一定测试后简单的认为分布比较均匀。
测试结果
(这水印也太挡视野了)
缺陷
性能问题
字符串处理性能应该是不好的,如果有更好的方式可以告诉我。
最终代码