最代码官方的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.pi 3.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
exp e的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

打赏

最代码最近下载分享源代码列表最近下载
最代码最近浏览分享源代码列表最近浏览
MrReady  LV14 2023年6月6日
Tomlin  LV12 2023年5月31日
易拉罐  LV8 2023年5月24日
浪里格朗  LV4 2023年1月31日
uuu1210  LV10 2022年12月23日
xiongfan  LV6 2021年2月18日
李海洋  LV12 2020年12月24日
sbsbsbsbsb  LV10 2020年12月7日
alittlemc  LV1 2020年10月16日
ft4453080  LV1 2020年7月17日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友