Lua 学习 chapter3 数值
目录
- 算术计算
- 关系运算
- 数学库
- 表示范围
- 运算符的优先级
- 练习
To be honest, i think what you have compare to others expection has a long way.
算术计算
在lua中,除法运算操作的永远是浮点数而且产生的结果也是浮点数。
在新的版本中针对于整数除法引入了一个floor除法的新运算符‘//’,floor除法会对得到的上进行向下取整,从而保证结果是一个整数。
如果操作数是整形类型结果就是整型类型,如果操作数是浮点类型那么结果就是浮点类型(其值是个整数),类似的取模运算(%)也是一样的。
关系运算
Lua提供了下列的关系运算:
< > <= >= == ~= 这个关系运算的返回值都是Boolean类型的。
数学库
Lua提供了标准的数学库 math,包含三角函数,指数,取整,最大最小,用于生成伪随机的random函数以及pi和huge(最大可表示的值)。
随机数发生器
lua中随机数共有三种调用方式:
- 不带参:随机返回一个伪随机的[0,1)的数
- 带一个整型参:返回一个[1,n]的伪随机整数
- 带两个整型参:返回一个[n,m]的伪随机整数
函数randomseed用于设置伪随机数发生器的种子,该函数的唯一参数就是数值类型的种子。
在一个程序启动时,系统固定使用1为随机数发生器。如果不设置其它种子,每次系统启动都会产生一样的随机数。
所以为了解决这个问题通常使用math.randomseed(os.time()) 来作为种子。
取整函数
- floor:向下取整
- ceil:向上取整
- modf:向0取整
就近取整:
1
2
3
4
5
6
7
8
function round(x)
local f = math.floor(x)
if (f == x) or (x % 2 == 0.5) then
return x
else
return math.floor(x + 0.5)
end
end
表示范围
lua使用64个比特位来存储整型值,其最大值为2^63 - 1。
我们可以简单的使用整数加上0.0来转换成浮点数。
在lua的管理中,超过2^53之后这样转换就会失去精度。
特别是在进行浮点数的运算过程中,可能会导致计算的不精确。例如:
12.7 -20 + 7.3,即便使用双精度来表示结果也不是0,因为12.7和7.3的二进制表示不是有限的小数。
运算符的优先级
- 一元运算符 (- # ~ not)
- / // % (// floor除)
-
- -
- ..(连接)
- « » (按位移位)
- &
- ~
-
- < > <= >= ~= ==
- and or
练习
乘2,就是左移一位。
使用math.random生成正太分布的为随机数发生器
采用 Box-Muller 变换可以将均匀分布转化成正态分布
Z=Rcosθ 或 Z=Rsinθ (其中 R = sqrt(-2ln(u1)), θ = 2π*u2,u1和u2是(0,1]的均匀分布随机数,得到的Z就是标准正态分布随机数。
-
生成均匀分布的随机数,math.random 函数生成的是 [ 0,1 ) 之间的随机数,只需在生成 0 时改为生成 1 。
-
通过Box-Muller公式得到服从正态分布的随机数
1
2
3
4
local rand1,rand2=math.random(),math.random()
rand1=rand1==0 and (1) or (rand1)
rand2=(rand2==0) and (1) or (rand2)
return math.sqrt(-2.0*(math.log(rand1)))*math.sin(2*math.pi*rand2);
<hr style="visibility: hidden;"/>
<hr style="visibility: hidden;"/>