博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Lua】使用随机数(转)
阅读量:4512 次
发布时间:2019-06-08

本文共 1488 字,大约阅读时间需要 4 分钟。

游戏中创建角色有个随机取名功能,用到了随机数,网上找了篇在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变化很小, 但是因为低位变了高位, 种子数值变化却很大,就可以使伪随机序列生成的更好一些

 

转载于:https://www.cnblogs.com/Liyang1992/p/4026824.html

你可能感兴趣的文章
Spring MVC兑现QQ第三方登录
查看>>
R类型5 R语言 数据帧
查看>>
百度云推送教程
查看>>
简单几步轻松实现在微信中直接下载APK
查看>>
python基础(六)
查看>>
接口的定义与使用
查看>>
Censtos Hadoop安装
查看>>
【模板】线段树 1(洛谷_3372)
查看>>
后台调用前台js
查看>>
解析ArrayList与LinkedList的遍历方法
查看>>
HTML/CSS权值继承
查看>>
数据基础
查看>>
Js函数
查看>>
C++多重继承问题
查看>>
SMINT:单页网站的免費jQuery插件
查看>>
[转]Objective-c中@class和#import
查看>>
Java 接口学习
查看>>
Oracle 统计信息窗口的相关知识
查看>>
Pollard-Rho大整数拆分模板
查看>>
Cortex M3 - STM32 Developing with GCC Tools
查看>>