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

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

    ongl存放数据可以存放在对象栈(root),也可以存放在map中 一.存放在map中 1.存放在map中可以分为存放在request.session.application public Strin ...

  2. MySQL数据库-错误1166 - Incorrect column name 'xxx' 的解决方法

    在用Navicat for MySQL给MySQL数据库修改表的字段时报如下的错误: 解决方法:检查字段里面是不是有空格,去掉就可以了.

  3. Lenovo笔记本Fn的总结

    Fn与其他按键结合使用以访问特殊的ThinkPad功能. Fn+F2  锁定计算机 Fn+F3 管理电池和电源 Fn+F4 进入睡眠(待机)模式 Fn+F5 管理无线连接 Fn+F6 打印屏幕 Fn+ ...

  4. sqlplus 调试存储过程

    SQLPLUS里测试带返回参数的存储过程过程名p_test入参 aa varchar2出参 bb sys_refcursor 在SQLPLUS里如何将sys_refcursor 这个结果集获取出来呢 ...

  5. oracle 数据库添加Java方法

    create or replace and compile java source named "Bitconverter" aspublic class Bitconverter ...

  6. IOS Core Image之一

    项目中要实现高斯模糊的效果,今天看了下Core Image这块的内容, 主要包括CIImage.CIFilter.CIContext.CIDetector(检测).CIFeature(特征)等类. 今 ...

  7. 解决 swap file “*.swp”already exists!问题

     用vim编辑文件实际上是先copy一份临时文件,病映射到内存给你编辑,编辑的是临时文件,当执行:w后才保存临时文件到原文件,执行:q后才删除临时文件. 每次启动检索是否有临时文件,有就询问如何处理, ...

  8. 【转】 面向对象(OO)程序设计

    前言 本文主要介绍面向对象(OO)程序设计,以维基百科的解释: 面向对象程序设计(英语:Object-oriented programming,缩写:OOP),指一种程序设计范型,同时也是一种程序开发 ...

  9. 访问Django项目出现DisallowedHost at / Invalid HTTP_HOST header问题

    闲来无事,想玩玩django,源码安装碰到了一堆乱七八糟依赖性问题,耗费一下午的时间总算是在ubuntu14.04上搭建好了python3+django2开发环境, 心血来潮,创建了一个django项 ...

  10. golang 记录函数执行耗时的一个简单方法。

    先写一个公共函数, 比如在 common 包下有这么一个方法: // 写超时警告日志 通用方法 func TimeoutWarning(tag, detailed string, start time ...