lua math.random伪随机问题浅析

本文探讨了 Lua 中使用 math.random 产生伪随机数的问题,解释了为何通过 os.time() 获取系统时间作为种子以避免伪随机数,并深入到 C 库源码层面分析了 rand 和 srand 的实现。建议为了获得更随机的结果,可以使用毫秒或微秒级别的系统时间作为种子。
摘要由CSDN通过智能技术生成

在lua中,如果我们需要随机数的时候,会使用到math.random,为了避免伪随机我们的一般编写方式如下:

-- 获取当前系统时间(秒)作为随机种子
math.randomseed(os.time())

-- 有三种方式:
-- 1. 不带参数调用时,获取的是[0,1)范围内的随机浮点数
-- 2. 带一个整型参数时,获取的是[1,n]范围内的随机整数
-- 3. 带两个整型参数m,n时,获取的是[m,n]范围内随机整数
-- 请注意Lua5.3以后,参数一定要为整数,否则会返回错误:bad argument #1 to 'random' (number has no integer representation)
math.random(10, 30)

为何避免伪随机,我们为何要使用os.time()获取系统时间秒数作为种子呢?接下来我们将从lua进入c中一层层的random,randomseed的实现慢慢剥离出来。

 

lua C库相关文件的官方下载地址:http://www.lua.org/ftp/

下载成功后,其相关文件在src目录中,我们可以查看lmathlib.c文件

或者查看lua 源码相关,其地址为:http://www.lua.org/source/5.1/ 

如下是关于lua中math库的相关C库的方法:

static const luaL_Reg mathlib[] = {
  {
    "abs",   math_abs},
  {
    "acos",  math_acos},
  {
    "asin",  math_asin},
  {
    "atan",  math_atan},
  {
    "ceil",  math_ceil},
  {
    "cos",   math_cos},
  {
    "deg",   math_deg},
  {
    "exp",   math_exp},
  {
    "tointeger
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值