Lua 随机数生成问题

2023-10-28

原文链接:http://blog.csdn.net/zhangxaochen/article/details/8095007


Lua 生成随机数需要用到两个函数:
math.randomseed(xx), math.random([n [, m]])

1. math.randomseed(n) 接收一个整数 n 作为随机序列种子。
2. math.random([n [, m]]) 有三种用法: 无参调用, 产生 (0,1) 之间的浮点随机数; 只有参数 n, 产生 1-n 之间的整数; 有两个参数 n, m, 产生 n-m 之间的随机整数

对于相同的随机种子, 生成的随即序列一定是相同的。所以程序每次运行, 赋予不同的种子很重要。很自然想到使用系统时间作为随机种子,即:

[plain]  view plain  copy
  1. math.randomseed(os.time())  
  2. ----然后不断产生随机数  
  3. for i=1, 5 do  
  4.  print(math.random())  
  5. end  


但是问题出来了, 如果程序运行时间, 你又在很短的时间内多次运行这个程序,那么你得到的随机序列会是几乎不变的。 像这样:
>lua -e "io.stdout:setvbuf 'no'" "test.lua" 
0.71141697439497
0.060121463667714
0.067506942960906
0.8607745597705
0.60652485732597
>Exit code: 0
>lua -e "io.stdout:setvbuf 'no'" "test.lua" 
0.71141697439497
0.060121463667714
0.067506942960906
0.8607745597705
0.60652485732597
>Exit code: 0
>lua -e "io.stdout:setvbuf 'no'" "test.lua" 
0.7115085299234
0.38813440351573
0.6127201147496
0.59511093478195
0.9212927640614
>Exit code: 0

可以看到前两次运行的随机数都是一样的。究其原因,就是 os.time() 返回的时间是秒级的, 不够精确, 而 random() 还有个毛病就是如果 seed 很小或者seed 变化很小,产生的随机序列仍然很相似。比如:

[plain]  view plain  copy
  1. math.randomseed(100)  
  2. print(math.random(1000))  
  3. math.randomseed(102)  
  4. print(math.random(1000))  


两次赋予的 seed 分别是 100, 102 但是random 生成的第一个随机数却是一样的。因此“短时间内多次运行程序” 这样的需求下 os.time 还真不大好。可是又没有比 time 函数更方便的种子生成器, 怎么办呢?
可以这样:

[plain]  view plain  copy
  1. math.randomseed(tostring(os.time()):reverse():sub(1, 6))  


就是把 time返回的数值字串倒过来(低位变高位), 再取高位6位。 这样, 即使 time变化很小, 但是因为低位变了高位, 种子数值变化却很大,就可以使伪随机序列生成的更好一些
参考文章:http://lua-users.org/wiki/MathLibraryTutorial
数学库源码: http://www.lua.org/source/5.1/lmathlib.c.html




本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Lua 随机数生成问题 的相关文章

  • 访问 Lua 类型元表

    显然 getmetatable 可以访问几种类型的元表 getmetatable getmetatable getmetatable newproxy true 然而 似乎您无法获取其他类型的元表 除了函数 似乎无法访问数字 布尔值或 ni
  • 迭代包括空行在内的行

    给定一个带有一些空行的多行字符串 我如何在Lua中迭代行包括空行 local s foo nbar n njim for line in magiclines s do print line and blank or line end gt
  • 在 lua 中使用相等运算符比较数字有多安全?

    在我的引擎中 我有一个用于脚本编写的 Lua VM 在脚本中 我写了这样的内容 stage stage 1 if stage 5 then end and objnum tonumber 5 if stage objnum 根据 Lua 来
  • LuaJit FFI 从 C 函数返回字符串到 Lua?

    假设我有这个 C 函数 declspec dllexport const char GetStr static char buff 32 Fill the buffer with some string here return buff 这
  • Lua 和序列化闭包

    我正在尝试序列化和反序列化 Lua 闭包 我的基本理解是下面的工厂应该生成闭包 并且Lua在函数和闭包之间没有太多区别 即没有类型 闭包 gt function ffactory x return function return x end
  • 什么更快?循环或多个 if 条件

    我想知道什么更快 是只用一条指令 即 1 1 执行 9 次 for 循环还是执行 9 个 if 条件时 我认为 if 更快 因为您不需要检查循环中的指令 它应该几乎相同 因为for循环本质上是检查if条件为真并运行一段代码 非常类似于if声
  • Lua 中的内联条件(a == b ? "yes" : "no")?

    无论如何 Lua 中可以使用内联条件吗 Such as print blah a true blah nahblah Sure print blah a and blah or nahblah
  • 如何解密Lua字节码?

    早上好 我正在尝试破译 Moon 字节码 但我无法以任何方式 有人可以帮助我吗 我有这个 例如 code 27 76 117 97 81 0 1 4 4 4 8 0 如何将此字节码解密为文本 我已经在这里搜索 http www asciit
  • 为什么 LuaJIT 和 Lua 中的数字舍入格式不同?

    Using string format 据说遵循 Csprintf 在 LuaJIT 轮次中格式化数字与我尝试过的所有其他 Lua 解释器不同 lua v Lua 5 4 1 Copyright C 1994 2020 Lua org PU
  • 如何在Conky中实现一个基本的Lua功能?

    我正在尝试向我的 Conky 添加一个函数 该函数打印字符串的长度以用于调试目的 代码位于名为的文件内test lua 非常简单 function test word return string len word end 我这样加载它 在我
  • 使用 FastCGI 运行 Lua 脚本

    我目前正在尝试找出使用 FastCGI 与 lighttpd 或 Nginx 一起运行 Lua 脚本的方法 我唯一能挖到的是WSAPI http keplerproject github com wsapi 开普勒计划的一部分 但我想知道是
  • Lua 将字符串转换为数字 - 取决于语言环境

    刚刚注意到字符串 and tonumber 在 Lua 中是依赖于语言环境的 知道如何在不使用的情况下将字符串转换为数字tonumber 谢谢 例如将字符串 58 5 转换为 58 5 另外 当我尝试将带点的数字传递给函数时 该函数会转换
  • 在Luasocket中,在什么条件下,即使在select告诉它可以安全读取之后,accept调用也可以阻塞?

    卢阿索基特select http w3 impa br diego software luasocket socket html select函数应该告诉何时可以在不阻塞的情况下读取套接字 它显然也可以用来告诉服务器套接字何时准备好接受新连
  • 如何终止Lua脚本?

    如何终止 Lua 脚本 现在我在 exit 方面遇到问题 我不知道为什么 这更像是一个 Minecraft ComputerCraft 问题 因为它使用了包含的 API 这是我的代码 while true do if turtle dete
  • LuaJ 导入 Lua 方法

    我正在使用 LuaJ 并且我有一个 lua文件充满了一堆函数 如何通过 LuaJ 导入这些函数以在 Java 中使用 一种选择是将文件编译为 Java 代码并导入它 另一种方法是使用可嵌入解释器直接从 Java 代码中调用 Lua 文件 E
  • 关闭 Löve2D 中的抗锯齿功能

    我在用着L ve2D http love2d org用于编写一个小游戏 L ve2D 是 Lua 的开源游戏引擎 我遇到的问题是 当您在非整数位置绘制精灵时 某些抗锯齿过滤器会自动应用于精灵 love graphics draw sprit
  • 推送 Lua 表

    我已经创建了一个Lua表C 但我不知道如何将该表推入堆栈顶部 以便我可以将其传递给 Lua 函数 有谁知道如何做到这一点 这是我当前的代码 lua createtable state libraries size 0 int table i
  • 如何使用 Lua 运行可执行文件?

    我有一个可执行文件想要使用 Lua 运行 我该怎么做 似乎无法在任何地方找到有关此的任何文档 您可以使用 Lua 原生的 执行 命令 Example os execute c temp program exe 资料来源 Lua 指南 os
  • Lua 的标准(或最好支持的)大数(任意精度)库是什么?

    我正在处理大量无法四舍五入的数字 使用 Lua 的标准数学库 似乎没有方便的方法来保持精度超过某些内部限制 我还看到有几个库可以加载以处理大数字 http oss digirati com br luabignum http oss dig
  • Lua表在内存中是如何处理的?

    lua如何处理表的增长 是否相当于ArrayList在Java中 IE 需要连续的内存空间 并且当它变得大于已经分配的空间时 内部数组被复制到另一个内存空间 有什么聪明的方法来引导吗 我的问题是 表是如何存储在内存中的 我不是问如何在 Lu

随机推荐

  • 矩阵违逆的求法_akala啦_新浪博客

    直接求解 求导 令导数为0 结果如下 InvA ATA 1AT 直接求伪逆 InvA inv A A A SVD求解 SVD分解求伪逆 原理和公式 1 SVD分解得到的矩阵 U和V是正交阵 S是对角阵 2 正交阵的逆 转置 3 对角阵的逆
  • 基于javaweb+springboot的宿舍寝室维修上报管理系统(java+SpringBoot+FreeMarker+Mysql)

    管理员 校园管理 楼栋管理 宿舍管理 师生管理 学生管理 辅导员管理 维修管理 维修工管理 维修进度管理 阅览室管理 座位生成等 学生信用积分管理 座位预约统计管理等 学生 登录 修改个人信息 上报宿舍维修信息 查看维修进度 完成维修进度等
  • flutter 常见错误 flutter no devices,No connected devices found;

    原文出处 解决方案 1 使用管理员模式启动AS 部分人试了可以 2 启动Flutter目录下的flutter console bat 执行下面的命令 flutter config android sdk sdk根目录 flutter con
  • Logstash【从无到有从有到无】【L16】使用插件

    目录 1 使用插件 1 1 代理配置 Proxy configuration 1 2 列出插件 Listing plugins 1 3 将插件添加到您的部署中 1 4 高级 添加本地构建的插件 1 5 高级 Using path plugi
  • 销售管理系统java sql_java+sqlserver商品销售管理系统的设计与实现

    摘 要 为解决传统商品销售管理系统操作不便的问题 在My Eclipse 2010 SQL Server 2008环境下 采用B S模式进行商品销售管理系统的设计与开发 实现网络化销售管理 系统主要分为两部分 购物管理部分和管理员管理部分
  • linux 之sed '1!G;h;$!d' file 的详细解释

    sed 1 G h d file 与tac file 命令执行结果相同 都是将行逆序输出 这条命令的详细解释 1 sed简介 sed是面向流的行编辑器 所谓面向流 是指接受标准输入的输入 输出内容到标准输出上 sed编辑器逐行处理文件 或输
  • python机器学习——图像内容分析

    计算机视觉 计算机视觉是一门研究如何使机器 看 的科学 更进一步的说 就是是指用摄影机和电脑代替人眼对目标进行识别 跟踪和测量等机器视觉 并进一步做图形处理 使电脑处理成为更适合人眼观察或传送给仪器检测的图像 计算机视觉包括多个级别的分析
  • Premiere Pro入门

    介绍 Adobe Premiere Pro 简称PR 是最强大的视频编辑软件 可同时创建多个时间轨道 多个视频素材按层遮挡 可对单个素材添加各种效果 例如放缩 移动 旋转 裁剪等 可插入图片遮挡视频素材 并且支持png透明 可添加字幕 可导
  • 新版Spring Boot(11)- Spring Boot 整合NoSQL(1)

    1 整合redis 单测 package com tzb cachespringboot import com tzb cachespringboot model User import org junit jupiter api Test
  • C++ 引用 解引用 取地址 指针 双指针 指针的引用 二级指针

    为了把引用 解引用 取地址 指针 双指针 指针的引用 二级指针 这一块弄清楚 钻研与查阅资料得到如下体会 1 引用与取地址 reference and address 引用的 前面一定有类型符号 否则就不是引用 取地址的 后面一定有变量名称
  • 景联文数据标注:AI大模型在教育和医疗领域的应用

    8月31日消息 备受行业瞩目的首批大模型产品获批名单发布 首批通过备案的8家大模型公司分别是 百度 文心一言 抖音 云雀大模型 智谱AI GLM大模型 中科院 紫东太初大模型 百川智能 百川大模型 商汤 日日新大模型 MiniMax ABA
  • 下载Git速度太慢的解决方法【记录】

    直接传送门 点击此链接即可进入git的下载仓库 https registry npmmirror com binary html path git for windows 如下图所示 点击选择你需要的版本进去下载就行了 这里记录一下 备忘
  • Qt 常用类 (4)—— QPoint

    QPoint 类代表一个坐标点 实现在 QtCore 共享库中 它可以认为是一个整型的横坐标和一个整型的纵坐标的组合 构造 QPoint 类支持以下两种构造方式 plain view plaincopy QPoint 构造横纵坐标均为 0
  • 静态链表的基本操作

    定义 用数组描述的链表叫做静态链表 这种描述方法还有起名叫做游标实现法 基本操作 Status InitList StaticLinkList space 将一维数组space中各分量链成一个备用链表 int Malloc SLL Stat
  • 以太坊区块与区块头数据结构解析

    Block数据结构解析 源代码 Block represents an entire block in the Ethereum blockchain type Block struct header Header uncles Heade
  • IBM MQ命令:DEFINE AUTHINFO

    此命令里有很多内容值得一看 https www ibm com docs en ibm mq 8 0 topic commands define authinfo q085490 6 一 CHCKCLNT CHCKCLNT This att
  • Git使用详解(结合GitLab和GitHub)

    转载请注明出处 https blog csdn net mythmayor article details 82346539 如果你想了解更多关于GitHub使用的问题 欢迎查看我的另一篇博客进行学习与交流 GitHub的使用详解 一 Gi
  • VC++读目录下所有文件

    include
  • ChatGPT训练营来啦,手把手带你玩转ChatGPT~

    ChatGPT的出现为测试行业带来了新的机遇和挑战 尽管许多人担心它的强大可能会取代测试人员 但实际上ChatGPT可以成为测试人员的强大助手 提高测试工作的效率和准确性 那么 我们应该如何借助 ChatGPT 让我们的测试工作更高效呢 C
  • Lua 随机数生成问题

    原文链接 http blog csdn net zhangxaochen article details 8095007 Lua 生成随机数需要用到两个函数 math randomseed xx math random n m 1 math