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

所以,当我们没有初始化的时候,如果直接使用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. Flink初始

    flink初始 flink是什么 为什么使用flink flink的基础概念 flink剖析 实例 flink是什么 flink是一个用于有界和无界数据流进行有状态的计算框架. flink提供了不同级 ...

  2. ThreadPoolExecutor 异常

    通过execute提交的任务,能将该任务抛出的异常交给未捕获异常处理器处理,而通过submit提交的任务,无论是抛出的未检查异常还是已检查异常,都将被认为是任务返回状态的一部分.如果一个由submit ...

  3. PTA (Advanced Level) 1014 Waiting in Line

    Waiting in Line Suppose a bank has N windows open for service. There is a yellow line in front of th ...

  4. Rest客户端

    public class RestClient { public string EndPoint { get; set; } //请求的url地址 public HttpVerb Method { g ...

  5. WeifenLuo.WinFormsUI.Docking.dll的用法

    基本框架 说明 weiFenLuo.winFormsUI.Docking.dll是开源项目DockPanel Suite的一个类库,可以实现像Visual Studio的窗口停靠.拖拽等功能.Weif ...

  6. 微信WeUI基础

    首先引入样式css和js 虽然基础的其实还有weui.min.css,但是为了一些动态效果,也要引入其他的东西. 基本框架 <!DOCTYPE html> <html lang=&q ...

  7. 将字符串 “ hello word,你 好 世 界 ! ” 两端空格去掉并且将其中的其他所有空格替换成一个空格 输出结果为“hello word,你 好 世界”

    string str = " hello word,你 好 世 界 ! "; string msg = str.Trim(); //去掉首尾空格 //使用split分割字符串,st ...

  8. DataGridView 绑定数据方法

    DataGridView控件用于显示来自多种外部数据源中的数据,用户可以在此控件添加行和列,并可以填充数据.   如要让DataGridView显示数据库中的数据,只需要将此控件绑定到挑用数据库的数据 ...

  9. Autocomplete 自动提示

    <!doctype html> <html lang="en"> <head> <meta charset="utf-8&quo ...

  10. SuperSubScriptHelper——Unicode上下标辅助类

    在项目的实施过程中,类似化学分子式.平方.立方等,需要处理上.下标字符. 上下标字符的实现,大致有两种方式,一种是字符本身包含上下标信息,另一种方式是通过格式化标记实现上下标字符的显示. Word中的 ...