【Lua】使用随机数(转)

摘要:
游戏中有一个用于创建角色的随机命名功能,它使用随机数。我在网上找到一篇关于在Lua使用随机数的文章。标记它。Lua需要两个函数来生成随机数:数学。randomseed,数学。数学随机种子接收整数n作为随机序列种子。将系统时间视为随机种子是很自然的,也就是说,数学随机——然后连续生成i=1,5do打印结束的随机数,但问题出现了。如果程序在短时间内运行几次,您得到的随机序列几乎不变。

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

免责声明:文章转载自《【Lua】使用随机数(转)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇C# winform开发嵌套Chrome内核浏览器(WebKit.net)开发(一)JS前端数据多条件筛选(商品搜索)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Apache Commons--RandomStringUtils随机数工具类

需要包:commons-lang.jar 1.RandomStringUtils.random(5):产生5位长度的随机字符串,中文环境下是乱码 2.RandomStringUtils.random(5, new char[]{'a','b','c','d','e','f', '1', '2', '3'}):使用指定的字符生成5位长度的随机字符串 3.Ra...

JS生成指定范围内的随机数(支持随机小数)

直接需要函数的话,直接到文章的最后面找。 ============================================================= 转载:https://www.cnblogs.com/mq0036/p/9139231.html 一、预备知识 Math.ceil(n); //向上取整。返回大于等于n的最小整数。 Math...

srand函数

srand函数是随机数发生器的初始化函数。  原型:void srand(unsigned seed);  用法:它需要提供一个种子,这个种子会对应一个随机数,如果使用相同的种子后面的rand()函数会出现一样的随机数。如: srand(1); 直接使用1来初始化种子。不过为了防止随机数每次重复常常使用系统时间来初始化,即使用 time函数来获得系统时间,...

蓝牙专题(3)——BLE协议栈(链路层Link Layer)*

链路层位于物理层之上,链路层和物理层一样,都属于BLE协议栈的controller(控制器)部分。 在我查看的文章和书籍上,都是一来就介绍链路层的五种状态,这对于笔者这样理解能力不够又喜欢刨根问底的人来说,无疑是一种折磨,那五种状态和链路层有什么关系,为什么网上各种文章还有书籍都是一来就介绍各种状态之间的转换?好吧,或许是因为BLE核心协议就是这样做的...

JAVA随机数生成Int、Long、Float、Double

随机数Int的生成 生成无边界的Int @Test public void testRandom_generatingIntegerUnbounded() throws Exception { int intUnbounded = new Random().nextInt(); System.out.println(intUnbounded)...

SSL详解

SSL 1.整体结构 SSL是一个介于HTTP协议与TCP之间的一个可选层,其位置大致如下 SSL:(Secure Socket Layer,安全套接字层),为Netscape所研发,用以保障在Internet上数据传输之安全,利用数据加密(Encryption)技术,可确保数据在网络上之传输过程中不会被截取。当前版本为3.0。它已被广泛地用于Web浏览...