我们都知道,所谓的随机都是伪随机,随机的结果是由随机算法和随机种子决定的。

所以,当我们没有初始化的时候,如果直接使用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的随机函数的更多相关文章

  1. OpenResty(nginx+lua) 入门

    OpenResty 官网:http://openresty.org/ OpenResty 是一个nginx和它的各种三方模块的一个打包而成的软件平台.最重要的一点是它将lua/luajit打包了进来, ...

  2. (转)OpenResty(nginx+lua) 开发入门

    原文:https://blog.csdn.net/enweitech/article/details/78519398 OpenResty 官网:http://openresty.org/  Open ...

  3. CentOS安装OpenResty(Nginx+Lua)开发环境

    一.简介 OpenResty® 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库.第三方模块以及大多数的依赖项.用于方便地搭建能够处理超高并发.扩展性极高 ...

  4. 给lnmp一键包中的nginx安装openresty的lua扩展

    lnmp一键包(https://lnmp.org)本人在使用之后发现确实好用,能帮助我们快速搭建起lnmp.lamp和lnmpa的web生产环境,因此推荐大家可以多试试.但有的朋友可能需要使用open ...

  5. 【原创】大叔问题定位分享(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 ...

  6. openresty安装lua和nginx相关

    server{ listen ; server_name a.com; index index.php; root /usr/share/nginx/html; location / { if (!- ...

  7. Openresty编写Lua代码一例

    1.前段时间纠结了很久,一直弄不清lua和tomcat的联系.一直认为是lua调用tomcat的接口才可使用,后面才明白过来,进入了一个误区,lua本身就是一门独立的脚本语言.在openresty里面 ...

  8. 【原创】运维基础之OpenResty(Nginx+Lua)+Kafka

    使用docker部署 1 下载 # wget https://github.com/doujiang24/lua-resty-kafka/archive/v0.06.tar.gz# tar xvf v ...

  9. 搭建OpenResty(Nginx+Lua)

    这篇文章是一个多月前写的,当时之所以搭建这个是为了最大程度上发挥Nginx的高并发效率(主要是结合lua脚本),参考的话,主要参考张开涛先生写的跟开涛学Nginx+lua系列文章,地址为:https: ...

随机推荐

  1. memcached 学习笔记 4

    memcached真实项目中的应用 1 缓存式的Web应用程序架构 有了缓存的支持,我们可以在传统的app层和db层之间加入cache层,每个app服务器都可以绑定一个mc, 每次数据的读取都可以从m ...

  2. java class load 类加载

    1:what is  it jvm把描述类的数据从class字节码文件加载到内存,并对数据进行校验.解析.初始化,最终成为jvm直接使用的数据类型 1.ClassNotFoundExcetpion  ...

  3. HDU 2193 AVL Tree

    AVL Tree An AVL tree is a kind of balanced binary search tree. Named after their inventors, Adelson- ...

  4. spring之validation校验

    对于任何一个应用而言在客户端做的数据有效性验证都不是安全有效的,这时候就要求我们在开发的时候在服务端也对数据的有效性进行验证.SpringMVC自身对数据在服务端的校验有一个比较好的支持,它能将我们提 ...

  5. 完美世界-Java游戏开发-二面

    时间:2017-03-30 时长:15分 类型:二面 面试官比较聊得来,人比较和善,游戏面试还是nice的,老铁 1. 自我介绍 2. 平时玩哪些游戏?端游.页游 3. Maven你是怎么使用的? 4 ...

  6. BigDecimal 精准加减乘除

    解决了double和float精确度的问题 Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算.双精度浮点型变量double可以处理16位有效 ...

  7. JAVA基础之——版本控制系统之git

    1 版本控制系统是什么 当多人协作开发一套产品时,需要能够保证代码都能够共用,那么版本控制系统就应运而生. 2 GIT 当前用的比较多的是svn和git,本文以git为例进行讲解. git诞生于200 ...

  8. 最全的HTTP 响应状态码列表!

    摘要: HTTP状态码,我们要学会现查现用能记住最好. 简单举例几个常用的状态码,比如200,302,304,404, 503. 一般来说我也只需要了解这些常用的状态码就可以了.如果是做AJAX,RE ...

  9. Java基础之JDK的下载与安装

    做Java开发已经很长一段时间了,最近在回顾Java的基础知识,感觉好多都是知道这个概念,能说个皮毛,但是往深了说又不知道怎么说,所以打算对Java从头做一个回顾,算是对自己所学知识的一个巩固和深入了 ...

  10. [LeetCode]Generate Parentheses题解

    Generate Parentheses: Given n pairs of parentheses, write a function to generate all combinations of ...