最代码广告位
最代码官方的gravatar头像
最代码官方2014-06-25 14:43:39

redis lua脚本学习笔记math.random()获取随机数

最近在公司研究lua在redis中的使用,其中有个算法要使用到随机数,但运行lua的math.random()后一直返回同一个数字,万能的stackoverflow也没能得到答案,最后通过一个很magic的方式实现的。

代码如下:

function rnd(max)
  --lua的第1次random数不靠谱,取第3次的靠谱
  local ret=0
  math.randomseed(os.time())
  for i=1,3 do
    n = math.random(max)
    ret=n
  end
  return ret
end

print(rnd(10))

每次运行的结果都不同

10

9

8

基本能满足需求了,虽然会稍微损耗些cpu。

另外的解决思路是通过client端生成随机数来调用,比如java的Random类。

另附上lua的math函数库

函数名描述示例结果
pi圆周率math.pi3.1415926535898
abs取绝对值math.abs(-2012)2012
ceil向上取整math.ceil(9.1)10
floor向下取整math.floor(9.9)9
max取参数最大值math.max(2,4,6,8)8
min取参数最小值math.min(2,4,6,8)2
pow计算x的y次幂math.pow(2,16)65536
sqrt开平方math.sqrt(65536)256
mod取模math.mod(65535,2)1
modf取整数和小数部分math.modf(20.12)20   0.12
randomseed设随机数种子math.randomseed(os.time()) 
random取随机数math.random(5,90)5~90
rad角度转弧度math.rad(180)3.1415926535898
deg弧度转角度math.deg(math.pi)180
expe的x次方math.exp(4)54.598150033144
log计算x的自然对数math.log(54.598150033144)4
log10计算10为底,x的对数math.log10(1000)3
frexp将参数拆成x * (2 ^ y)的形式math.frexp(160)0.625    8
ldexp计算x * (2 ^ y)math.ldexp(0.625,8)160
sin正弦math.sin(math.rad(30))0.5
cos余弦math.cos(math.rad(60))0.5
tan正切math.tan(math.rad(45))1
asin反正弦math.deg(math.asin(0.5))30
acos反余弦math.deg(math.acos(0.5))60
atan反正切math.deg(math.atan(1))45

打赏

最代码最近下载分享源代码列表最近下载
最代码最近浏览分享源代码列表最近浏览
zx8861 LV31月15日
星星星星星星
ncd12320 LV81月12日
月亮月亮
luohaipeng LV232019年11月20日
太阳月亮星星星星星星
codecodeboy LV12019年11月13日
星星
a3870764722a LV222019年6月13日
太阳月亮星星星星
zhjwgs LV132019年3月5日
月亮月亮月亮星星
wlh2015 LV202018年12月4日
太阳月亮
vijayChen LV162018年7月4日
太阳
2602275348 LV112018年7月2日
月亮月亮星星星星星星
筱进GG LV382018年5月24日
太阳太阳月亮星星星星
顶部客服微信二维码底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友