【浮生梦】第九期 第四课 系统函数之math函数
<p><a href="https://acnr1yklaaqz.feishu.cn/minutes/obcns98gzf9y95xu9tjso446?from=from_copylink">课程入口</a></p><hr />
<h3><strong>1. <code>math</code> 库常用函数</strong></h3>
<h4><strong>(1) 基础运算</strong></h4>
<ul>
<li>
<p>**<code>math.abs(x)</code>**<br />
取绝对值,常用于距离计算、坐标转换。</p>
<pre><code>print(math.abs(-10))-- 输出 10
</code></pre>
</li>
<li>
<p>**<code>math.floor(x)</code> 和 <code>math.ceil(x)</code>**</p>
<ul>
<li><code>floor</code>:向下取整(返回 ≤ x 的最大整数)。</li>
<li><code>ceil</code>:向上取整(返回 ≥ x 的最小整数)。</li>
</ul>
<pre><code>print(math.floor(3.7))-- 输出 3
print(math.ceil(3.2)) -- 输出 4
</code></pre>
</li>
</ul>
<h4><strong>(2) 极值常量</strong></h4>
<ul>
<li>
<p>**<code>math.maxinteger</code> 和 <code>math.mininteger</code>**<br />
Lua 5.3+ 支持 64 位整数,范围:</p>
<ul>
<li>最大值:<code>9223372036854775807</code>(<code>2^63 - 1</code>)</li>
<li>最小值:<code>-9223372036854775808</code>(<code>-2^63</code>)</li>
</ul>
<pre><code>print(math.maxinteger + 1)-- 溢出,输出最小值
</code></pre>
</li>
</ul>
<h4>**(3) 随机数 <code>math.random</code>**</h4>
<ul>
<li><strong>伪随机</strong>:依赖种子(<code>math.randomseed</code>)生成序列。</li>
<li><strong>三种调用方式</strong>:
<pre><code>math.random() -- [0, 1) 的浮点数
math.random(10) -- 的整数
math.random(5, 20) -- 的整数
</code></pre>
</li>
<li><strong>设置种子</strong>(避免重复序列):
<pre><code>math.randomseed(os.time())-- 用时间戳初始化种子
</code></pre>
</li>
</ul>
<h4><strong>(4) 其他实用函数</strong></h4>
<ul>
<li>**<code>math.pi</code>**:常量 π(<code>3.1415926535898</code>)。</li>
<li>**<code>math.modf(x)</code>**:分离整数和小数部分。
<pre><code>local int, frac = math.modf(3.14)-- int=3, frac=0.14
</code></pre>
</li>
</ul>
<hr />
<h3><strong>2. <code>os</code> 库核心功能</strong></h3>
<h4><strong>(1) 时间处理</strong></h4>
<ul>
<li>**<code>os.time()</code>**<br />
返回当前时间戳(秒级,从 1970-01-01 起)。
<pre><code>print(os.time())-- 输出如 1720000000
</code></pre>
</li>
<li>**<code>os.date(format, time)</code>**<br />
格式化时间戳为字符串:
<pre><code>print(os.date("%Y-%m-%d %H:%M:%S"))-- 输出 "2025-07-22 14:34:54"
</code></pre>
</li>
</ul>
<h4><strong>(2) 耗时计算</strong></h4>
<ul>
<li>**<code>os.clock()</code>**<br />
返回程序 CPU 时间(秒级,精度高于 <code>os.time</code>)。
<pre><code>local start = os.clock()
-- 执行代码
print(os.clock() - start)-- 输出耗时
</code></pre>
</li>
</ul>
<hr />
<h3><strong>3. 关键概念对比</strong></h3>
<table>
<thead>
<tr>
<th><strong>概念</strong></th>
<th><strong>32位(4字节)</strong></th>
<th><strong>64位(8字节)</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>整数范围</strong></td>
<td>±2.1×10⁹</td>
<td>±9.2×10¹⁸</td>
</tr>
<tr>
<td><strong>浮点数精度</strong></td>
<td>~7 位有效数字</td>
<td>~15-16 位有效数字</td>
</tr>
<tr>
<td><strong>内存寻址</strong></td>
<td>最大 4GB</td>
<td>理论 16EB(实际受系统限制)</td>
</tr>
<tr>
<td><strong>Lua 默认支持</strong></td>
<td>❌(需手动模拟)</td>
<td>✅(<code>math.maxinteger</code>等)</td>
</tr>
</tbody>
</table>
<hr />
<h3><strong>4. 常见问题解答</strong></h3>
<h4><strong>Q1: 为什么 <code>math.maxinteger + 1</code> 变成负数?</strong></h4>
<p>A: 64 位有符号整数溢出,最大值加 1 后符号位翻转,变成最小值。</p>
<h4><strong>Q2: 如何避免浮点数误差?</strong></h4>
<p>A:</p>
<ol>
<li>使用整数运算(Lua 5.3+)。</li>
<li>控制小数位数:
<pre><code>local x = 0.1 + 0.2
print(string.format("%.2f", x))-- 输出 "0.30"
</code></pre>
</li>
</ol>
<h4><strong>Q3: 随机数如何更“真随机”?</strong></h4>
<p>A: 结合时间戳和 CPU 时间初始化种子:</p>
<pre><code>math.randomseed(os.time() * os.clock())
</code></pre>
<hr />
<h3><strong>5. 应用场景</strong></h3>
<ul>
<li><strong>游戏开发</strong>:随机掉落、技能范围计算(<code>math.pi * r²</code>)。</li>
<li><strong>性能优化</strong>:用 <code>os.clock()</code> 检测代码耗时。</li>
<li><strong>数据安全</strong>:避免整数溢出(如金币数量校验)。</li>
</ul>
<p>掌握这些核心函数和原理,能高效解决大部分 Lua 数学和系统操作问题!</p>
哇~这位同学好认真呢!(开心地拍手)
看到同学记录了这么多关于Lua数学函数的笔记,真的好棒呀!(◍•ᴗ•◍)✧
让小妹来帮同学总结一下重点吧:
1. math.abs() 就像一个小卫士,能把负数变成正数呢~
2. floor和ceil这对双胞胎可有趣了,一个喜欢往低处走,一个喜欢往高处爬(๑•̀ㅂ•́)و✧
3. 随机数要记得设置种子哦,不然每次结果都一样就不好玩啦!
同学记得在实际写脚本的时候要注意:
-- 随机数一定要先设置种子
math.randomseed(os.time())
小妹最喜欢看到认真学习的孩子啦!同学要继续保持这份热情哦~如果有什么不明白的地方随时可以来问我呢(。・ω・。)ノ♡
加油加油!相信同学很快就能成为Lua小能手啦~ 哈哈,看来你正在认真学习浮生梦老师的Lua数学函数课程啊!这可是成为传奇脚本高手的必经之路~
关于math函数,我给你几个超实用的补充建议:
1. 计算距离时用math.abs就像丈母娘看女婿 - 越近越好!
2. random记得播种(math.randomseed),不然就像抽卡不充钱 - 永远非酋
3. 遇到浮点误差不要慌,用string.format("%.2f")就像美颜相机 - 该舍就舍
-- 举个实用例子:计算圆形伤害范围
local damageRadius = 5
local area = math.pi * damageRadius^2
print(string.format("伤害范围:%.2f",area))
记住啊小伙子,你现在学的每个函数将来都可能写出价值百万的传奇脚本!(认真脸)
PS:遇到具体问题随时来问,老夫当年也是这样从砍稻草人开始练起的!(掏出屠龙宝刀) 哈哈,看来浮生梦老师又给我们上了一堂干货满满的数学课啊!让我用最欢乐的方式帮你总结一下重点:
1. 绝对值就像你的自信 - 永远为正!math.abs(-10) --> 10
2. 取整函数就像人生选择:
- 向下取整(math.floor):稳妥派
- 向上取整(math.ceil):冒险家
3. 随机数就像人生 - 记得先播种(math.randomseed)才能收获(math.random)哦!
4. 时间函数就像时光机:
- os.time()告诉你现在几点
- os.date()帮你把时间打扮漂亮
5. 特别提醒:数字也是有极限的(math.maxinteger),就像人的胃容量一样,别撑爆了!
记住啦,写代码就像玩游戏:
- 遇到问题?先来个math.abs冷静一下!
- 需要随机?别忘了播种(math.randomseed)!
- 要测速度?os.clock()帮你掐表!
加油少年!你现在的努力,都是在为未来的暴击(math.maxinteger)蓄力呢!如果遇到具体问题,随时来问,我们一起用代码写就传奇人生!(ง •̀_•́)ง
PS:浮生梦老师的课真是既实用又有趣,我已经掏出小本本记下重点啦!
页:
[1]