openresty及lua的随机函数
我们都知道,所谓的随机都是伪随机,随机的结果是由随机算法和随机种子决定的。
所以,当我们没有初始化的时候,如果直接使用math.random(),那么出来的值肯定是每次都一样,因为种子等于0。
因此,我们都会在进程启动前,我们先调用一下种子
--随机种子初始化
math.randomseed(tostring(os.time()):reverse():sub(1, 6))
但是,这一切在operensty的多进程里面被打破了,因为随机以后的因子。。各个进程不共享。。
如果,有2个进程,那么意味着,同样的值会出现两遍,比如在游戏里面开宝箱,很容易被玩家抓到规律。
好吧,除非将随机因子放入共享内存,并且自己实现随机算法,不然的话。。math.random是废了!
好了,不需要随机种子的随机方法,我想起了。。/dev/random
以下文档摘自https://zh.wikipedia.org/wiki//dev/random
由于不可抗拒原因,大家可以看看截图

我们只要知道这样的随机方式,不可预测的真随机,来自硬件的因子,并且记得
- /dev/random是阻塞的
- /dev/urandom是非阻塞的
那么,对我们而言/dev/urandom是够的,所以。。我还是把代码贴一下就好了
local MAX_UINT = math.pow(,) --由于随机函数是非常频繁的,所以,还是做了一个随机池在那边,先随机一大部分放着
local cache_results = {}
local cache_index = local table_getn = table.getn --种子不需要初始化了
local function init()
end --从系统随机文件中读取
local function urandom()
--看下缓存里面还有没有
local this_count = table_getn(cache_results) - cache_index
if this_count <= then
--每次读取128个整数,512个字节缓存下来
local COUNT =
local frandom = assert(io.open("/dev/urandom", "rb"))
local s = frandom:read( * COUNT)
assert(s:len() == * COUNT) for i=,COUNT do
--读取4个字节作为一个整数
local v =
for c = , do
v = * v + s:byte(i*c)
end
cache_results[i] = v
end
io.close(frandom) --重新把
this_count = table_getn(cache_results)
cache_index =
end cache_index = cache_index +
return cache_results[cache_index]
end local rand = urandom --随机一个0-1之间的浮点数
local function randFloat()
return rand()/(MAX_UINT+)
end --随机给定范围[a,b]的整数
local function randInt(a, b)
assert(b >= a)
local v = rand()
return a + math.floor((b-a+)*randFloat())
end return {
init = init,
rand = rand,
urandom = urandom,
randInt = randInt,
randFloat = randFloat
}
openresty及lua的随机函数的更多相关文章
- OpenResty(nginx+lua) 入门
OpenResty 官网:http://openresty.org/ OpenResty 是一个nginx和它的各种三方模块的一个打包而成的软件平台.最重要的一点是它将lua/luajit打包了进来, ...
- (转)OpenResty(nginx+lua) 开发入门
原文:https://blog.csdn.net/enweitech/article/details/78519398 OpenResty 官网:http://openresty.org/ Open ...
- CentOS安装OpenResty(Nginx+Lua)开发环境
一.简介 OpenResty® 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库.第三方模块以及大多数的依赖项.用于方便地搭建能够处理超高并发.扩展性极高 ...
- 给lnmp一键包中的nginx安装openresty的lua扩展
lnmp一键包(https://lnmp.org)本人在使用之后发现确实好用,能帮助我们快速搭建起lnmp.lamp和lnmpa的web生产环境,因此推荐大家可以多试试.但有的朋友可能需要使用open ...
- 【原创】大叔问题定位分享(36)openresty(nginx+lua)中获取不到post数据,ngx.req.get_body_data返回nil
openresty(nginx+lua)中获取不到post数据,ngx.req.get_body_data返回nil This function returns nil if the request ...
- openresty安装lua和nginx相关
server{ listen ; server_name a.com; index index.php; root /usr/share/nginx/html; location / { if (!- ...
- Openresty编写Lua代码一例
1.前段时间纠结了很久,一直弄不清lua和tomcat的联系.一直认为是lua调用tomcat的接口才可使用,后面才明白过来,进入了一个误区,lua本身就是一门独立的脚本语言.在openresty里面 ...
- 【原创】运维基础之OpenResty(Nginx+Lua)+Kafka
使用docker部署 1 下载 # wget https://github.com/doujiang24/lua-resty-kafka/archive/v0.06.tar.gz# tar xvf v ...
- 搭建OpenResty(Nginx+Lua)
这篇文章是一个多月前写的,当时之所以搭建这个是为了最大程度上发挥Nginx的高并发效率(主要是结合lua脚本),参考的话,主要参考张开涛先生写的跟开涛学Nginx+lua系列文章,地址为:https: ...
随机推荐
- R语言列表list函数
列表是R语言中的对象,它包含不同类型的元素,比如 - 数字,字符串,向量和另一个列表等.一个列表还可以包含一个矩阵或一个函数作为它的元素.使用list()函数创建列表. 创建一个列表 下面是一个例子来 ...
- Ruby(1):入门
安装: 一般来说linux会自动装ruby,可以通过: ruby -v 来查看ruby版本 直接使用ruby命令的话,是用来执行ruby文件的.如果要打开交互式ruby解释器.只需要在控制台输入:ir ...
- Spring中使用JMS
JMS为了Java开发人员与消息代理(message broker)交互和收发消息提供了一套标准API.而且,由于每个message broker都支持JMS,所以我们就不需要学习额外的消息API了. ...
- io多大合适
MySQL的cpu iowait值,<=1/(number of cores).例如,如果是8核的,io wait 应<=12%. "Monitor DB CPU IO wait ...
- flush table with read lock的轻量级解决方案
为什么要使用FTWRL MySQL dba在日常工作中,数据备份绝对是工作频度最高的工作内容之一.当你使用逻辑方式进行备份(mydumper,mysqldump)或物理方式进行备份(percona ...
- Cookie,Sesstion,Application 缓存。
Cookie客户端缓存. 1.引言 随着浏览器的处理能力不断增强,越来越多的网站开始考虑将数据存储在「客户端」,那么久不得不谈本地存储了. 本地存储的好处: 一是避免取回数据前页面一片空白,如果不需要 ...
- HTTP的response code 1xx,2xx,3xx,4xx,5xx分别代表什么
HTTP 状态码点击链接可了解详情.您也可以访问 HTTP 状态码上的 W3C 页获取更多信息. 1xx(临时响应):表示临时响应并需要请求者继续执行操作的状态码. 2xx (成功):表示成功处理了请 ...
- Android Studio下载/更新SDK
今天安装配置Android Studio的时候,用SDK Manager下载SDK的时候只显示了一个7.0,别的都刷新不出来(被墙了).去网上搜索怎么解决,发现很多帖子的方法已经过时了(跟现在的AS版 ...
- 转:zip 和 unzip 的参数说明
收集的资料: 1. 我想把一个文件abc.txt和一个目录dir1压缩成为yasuo.zip: # zip -r yasuo.zip abc.txt dir1 2.我下载了一个yasuo.zip文件, ...
- poj 2796 Feel Good 单调队列
Feel Good Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 8753 Accepted: 2367 Case Ti ...