lua中的随机数
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 之间的随机整数
对于相同的随机种子, 生成的随即序列一定是相同的。所以程序每次运行, 赋予不同的种子很重要。很自然想到使用系统时间作为随机种子,即:
math.randomseed(os.time())
----然后不断产生随机数
for i=1, 5 do
print(math.random())
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 变化很小,产生的随机序列仍然很相似。比如:
math.randomseed(100)
print(math.random(1000))
math.randomseed(102)
print(math.random(1000))
两次赋予的 seed 分别是 100, 102 但是random 生成的第一个随机数却是一样的。因此“短时间内多次运行程序” 这样的需求下 os.time 还真不大好。可是又没有比 time 函数更方便的种子生成器, 怎么办呢?
可以这样:
math.randomseed(tostring(os.time()):reverse():sub(1, 6))
就是把 time返回的数值字串倒过来(低位变高位), 再取高位6位。 这样, 即使 time变化很小, 但是因为低位变了高位, 种子数值变化却很大,就可以使伪随机序列生成的更好一些
---------------------
作者:zhangxaochen
来源:CSDN
原文:https://blog.csdn.net/zhangxaochen/article/details/8095007
版权声明:本文为博主原创文章,转载请附上博文链接!
最新文章
- php.exe php-cgi.exe php-win.exe的区别
- Vagrant使用
- Android开发之XUtils框架使用和报错处理
- Spring3系列4-多个配置文件的整合
- CodeIgniter配置之SESSION
- Oracle 客户端安装 + pl/sql工具安装配置
- SqlServer 使用小技巧
- Android 之 ExpandableListView 的使用
- message from server: ";Host 'xxx' is not allowed to connect to this MySQL server的解决
- 远程登录aws
- 页面刷新vuex数据消失问题解决方案
- canvas实现画板
- 使用控制台对Redis执行增删改查命令
- [LeetCode] Global and Local Inversions 全局与局部的倒置
- NLP入门(二)探究TF-IDF的原理
- 万物互联之~RPC专栏
- 词向量之Word2vector原理浅析
- js获取参数函数
- ASP.NET Core 中 HttpContext 详解与使用 | Microsoft.AspNetCore.Http 详解 (转载)
- 新兴的API(fileReader、geolocation、web计时、web worker)
热门文章
- Android招聘市场技术要求越来越高,从事三年开发是否应该考虑转行?
- SpringCloud升级之路2020.0.x版-10.使用Log4j2以及一些核心配置
- druid与知乎平台
- Longhorn 企业级云原生分布式容器存储-券(Volume)和节点(Node)
- 零基础学Java之Java学习笔记(四):运算符
- 不同JDK版本的流异常处理
- 是的你没看错,HTTP3来了
- 14.SpringMVC之文件上传下载
- Java环境变量(Env)和系统属性(Property)详解
- 使用dom4j工具:获得文本内容(四)