【Lua】使用随机数(转)

游戏中创建角色有个随机取名功能,用到了随机数,网上找了篇在lua中使用随机数的文章,mark一下。

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变化很小, 但是因为低位变了高位, 种子数值变化却很大,就可以使伪随机序列生成的更好一些

时间: 2024-08-18 18:23:41

【Lua】使用随机数(转)的相关文章

lua 中随机数产生

需要用到两个函数: (1)math.randomseed(N):  接收一个整数N作为随机序列种子 (2)math.random([n, [m]]): 这个函数有三种用法,分别是不跟参数,此时产生(0,1)之间的随机浮点数:有一个参数n,产生1到n之间的整数:有2个参数n和m,产生n到m之间的随机整数. 最常用的方法是 math.randomseed(os.time()) for i=0, 10 do local n = math.random(10) print(n) end math.ran

Redis Lua 脚本使用

Lua语言提供了如下几种数据类型:booleans(布尔).numbers(数值).strings(字符串).tables(表格). 下面是一些 Lua 的示例,里面注释部分会讲解相关的作用: -- -- -- 拿客 -- 网站:www.coderknock.com -- QQ群:213732117 -- 三产 创建于 2017年06月15日 12:04:54. -- 描述: -- -- local strings website = "coderknock.com" print(we

lua常用操作

1 .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 之间的随机整数 注:os.time() 返回的时间是秒级的, 不够精确,

Lua与C的相互调用

闲的蛋疼,让C和Lua玩包剪锤.结果C以微弱的优势胜出了. 言归正传,这次主要是想练习Lua和C的相互调用. 一.C调用Lua函数 1. luaL_dofile(L, fn); 该函数可以让Lua虚拟栈读取路径为fn的Lua文件,其实质是: lua_loadfile(L, fn) || lua_pcall(L, 0, Lua_MUTIRET, 0) 实际上,lua_loadfile只是把Lua文件加载到VM,成为一个可执行的对象,但却还没有执行它,所以还不能使用. 而lua_pcall则把该Lu

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 之间的随机整数 对于相同的随机种子, 生成的随即序列一定是相同的.所以程序每次运行, 赋予不同

高性能伪事务之Lua in Redis

EVAL简介 Redis2.6加入了对Lua脚本的支持.Lua脚本可以被用来扩展Redis的功能,并提供更好的性能. 在<Redis拾遗>中曾经引用了<Redis in Action>中的一套悲观锁的实现,使用Lua脚本实现同样的功能,性能提高1倍以上.在另一个自动补全的例子中,使用Lua脚本比WATH/MULTI/EXEC快了20倍. EVAL 和 EVALSHA 命令是从 Redis 2.6.0 版本开始的,使用内置的 Lua 解释器,可以对 Lua 脚本进行求值. EVAL的

用lua实现的不重复随机数

空间复杂度为(1-n),时间复杂度为应该也是最低的,lua方便之处还是很值得利用的 local Random = {}; ? function Random:Awake() ????self.m_min = 1; ????self.m_max = 1; ????self.m_end = 1; ????self.m_rangeMap = {}; end ? function Random:setRange( min,max ) ????if min > max then ????????min,m

Lua中table内建排序与C/C++/Java/php/等内排序算法的排序效率比较

Lua这类脚本语言在处理业务逻辑作为配置文件的时候方便省事 但是在大量需要 运算的地方就显得略微不足   按照 Lua内建排序算法 对比C/C++ PHP Java等的快速排序算法进行一下比较. 快速排序算法是基于冒泡排序,优化而来,时间复杂度T(n)=O(nLog2n)  ,可见内部采用了二分策略 . 发现在LuaIDE LDT下直接运行效率要比 通过C++加载运行Lua脚本效率高的多  拿500W个数据排序 来说  ,脚本如下 同样的排序脚本Lua解释器的内置排序算法在LDT下,运行速度比通

openresty+lua在反向代理服务中的玩法

openresty+lua在反向代理服务中的玩法 phith0n · 2015/06/02 10:35 0x01 起因 几天前学弟给我介绍他用nginx搭建的反代,代理了谷歌和维基百科. 由此我想到了一些邪恶的东西:反代既然是所有流量走我的服务器,那我是不是能够在中途做些手脚,达到一些有趣的目的. openresty是一款结合了nginx和lua的全功能web服务器,我感觉其角色和tornado类似,既是一个中间件,也结合了一个后端解释器.所以,我们可以在nginx上用lua开发很多“有趣”的东