数学库教程 |
|
math.abs math.acos math.asin math.atan math.ceil math.cos math.deg math.exp math.floor math.fmod math.huge math.log math.max math.maxinteger math.min math.mininteger math.modf math.pi math.rad math.random math.randomseed math.sin math.sqrt math.tan math.tointeger math.type math.ult
> = math.abs(-100) 100 > = math.abs(25.67) 25.67 > = math.abs(0) 0
> = math.acos(1) 0 > = math.acos(0) 1.5707963267949 > = math.asin(0) 0 > = math.asin(1) 1.5707963267949
math.atan
来实现。
> c, s = math.cos(0.8), math.sin(0.8) > = math.atan(s/c) 0.8 > = math.atan(s,c) 0.8
通常应该优先使用两个参数,尤其是在将直角坐标转换为极坐标时。 它将使用两个参数的符号将结果放置到正确的象限,并且在其中一个参数为 0 或非常接近 0 时也会产生正确的值。
> = math.atan(1, 0), math.atan(-1, 0), math.atan(0, 1), math.atan(0, -1) 1.5707963267949 -1.5707963267949 0 3.1415926535898
> = math.floor(0.5) 0 > = math.ceil(0.5) 1 > = math.floor(-0.5) -1 > = math.ceil(-0.5) -0
> = math.cos(math.pi / 4) 0.70710678118655 > = math.sin(0.123) 0.12269009002432 > = math.tan(5/4) 3.0095696738628 > = math.tan(.77) 0.96966832796149
> = math.deg(math.pi) 180 > = math.deg(math.pi / 2) 90 > = math.rad(180) 3.1415926535898 > = math.rad(1) 0.017453292519943
math.exp(myval)
返回 e(自然对数的底)的 myval
次方。 math.log()
返回它的逆运算。 math.exp(1)
返回 e。
> = math.exp(0) 1 > = math.exp(1) 2.718281828459 > = math.exp(27) 532048240601.8 > = math.log(532048240601) 26.999999999998 > = math.log(3) 1.0986122886681
> = math.min(1,2) 1 > = math.min(1.2, 7, 3) 1.2 > = math.min(1.2, -7, 3) -7 > = math.max(1.2, -7, 3) 3 > = math.max(1.2, 7, 3) 7
> = math.modf(5) 5 0 > = math.modf(5.3) 5 0.3 > = math.modf(-5.3) -5 -0.3
如果您想要模数(余数),请查找模运算符 %
。 [2]
> = math.sqrt(100) 10 > = math.sqrt(1234) 35.128336140501 > = math.sqrt(-7) -1.#IND
math.random()
生成均匀分布的伪随机数。 提供参数会改变其行为
math.random()
不带参数会生成 0 到 1 之间的实数。
math.random(upper)
生成 1 到 upper(包含)之间的整数。
math.random(lower, upper)
生成 lower 到 upper(包含)之间的整数。
> = math.random() 0.0012512588885159 > = math.random() 0.56358531449324 > = math.random(100) 20 > = math.random(100) 81 > = math.random(70,80) 76 > = math.random(70,80) 75
math.floor(upper)
,有时会得到 math.ceil(upper)
,从而导致意外结果(lower 也是如此)。
math.randomseed()
函数为伪随机生成器设置一个 种子:相同的种子会产生相同的数字序列。
> math.randomseed(1234) > = math.random(), math.random(), math.random() 0.12414929654836 0.0065004425183874 0.3894466994232 > math.randomseed(1234) > = math.random(), math.random(), math.random() 0.12414929654836 0.0065004425183874 0.3894466994232
一个好的*“种子”*是 `os.time()`,但在调用该函数获取另一个序列之前,请等待一秒钟!要获得良好的随机数,请使用
math.randomseed( os.time() )
然而,在某些情况下,我们需要一个受控的序列,就像使用已知种子获得的序列一样。
但要注意!你得到的第一个随机数并不真正“随机化”(至少在 Windows 2K 和 OS X 中是这样)。要获得更好的伪随机数,只需在实际使用它们之前弹出一些随机数
-- Initialize the pseudo random number generator math.randomseed( os.time() ) math.random(); math.random(); math.random() -- done. :-)
-- 这并不完全正确。第一个随机数与第二个随机数和其他随机数一样好(或一样坏)。生成器的优劣取决于其他因素。为了稍微改进内置生成器,我们可以使用以下形式的表
-- improving the built-in pseudorandom generator do local oldrandom = math.random local randomtable math.random = function () if randomtable == nil then randomtable = {} for i = 1, 97 do randomtable[i] = oldrandom() end end local x = oldrandom() local i = 1 + math.floor(97*x) x, randomtable[i] = randomtable[i], x return x end end
[5]:为什么 `math.random()` 在 OSX 和 FreeBSD 上可能会给出奇怪的结果?
*...问题似乎是,当种子差异很小时,由 BSD `rand()` 生成的第一个值也差异很小。当 Lua 将 `rand()` 返回的整数转换为实数时,这种差异就会丢失,实际上只保留了结果中的高位。当你从 Lua 中调用 `math.random(1,100)` 时,低位差异就会消失,你会看到相同的整数结果。
-- improve seeding on these platforms by throwing away the high part of time, -- then reversing the digits so the least significant part makes the biggest change -- NOTE this should not be considered a replacement for using a stronger random function -- ~ferrix math.randomseed( tonumber(tostring(os.time()):reverse():sub(1,6)) )
还有 `lrandom` [6],一个基于 Mersenne Twister 生成随机数的库。
math.huge
math.huge
是一个常量。它表示 +无穷大。
> = math.huge inf > = math.huge / 2 inf > = -math.huge -inf > = math.huge/math.huge -- indeterminate nan > = math.huge * 0 -- indeterminate nan > = 1/0 inf > = (math.huge == math.huge) true > = (1/0 == math.huge) true
请注意,对math.huge
的一些操作会返回一个特殊的“非数字”值,显示为nan
。这有点用词不当。nan
是一种数字类型,尽管它与其他数字不同。
> = type(math.huge * 0) number
另请参见 浮点数。
这是圆周率常数的一部分。
> = math.pi 3.1415926535898