zoukankan      html  css  js  c++  java
  • Lua 随机数生成问题

    原文链接:http://blog.csdn.net/zhangxaochen/article/details/8095007

    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 之间的随机整数

    对于相同的随机种子, 生成的随即序列一定是相同的。所以程序每次运行, 赋予不同的种子很重要。很自然想到使用系统时间作为随机种子,即:

    1. math.randomseed(os.time())  
    2. ----然后不断产生随机数  
    3. for i=1, 5 do  
    4.  print(math.random())  
    5. 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 变化很小,产生的随机序列仍然很相似。比如:

    1. math.randomseed(100)  
    2. print(math.random(1000))  
    3. math.randomseed(102)  
    4. print(math.random(1000))  


    两次赋予的 seed 分别是 100, 102 但是random 生成的第一个随机数却是一样的。因此“短时间内多次运行程序” 这样的需求下 os.time 还真不大好。可是又没有比 time 函数更方便的种子生成器, 怎么办呢?
    可以这样:

    1. math.randomseed(tostring(os.time()):reverse():sub(1, 6))  


    就是把 time返回的数值字串倒过来(低位变高位), 再取高位6位。 这样, 即使 time变化很小, 但是因为低位变了高位, 种子数值变化却很大,就可以使伪随机序列生成的更好一些
    参考文章:http://lua-users.org/wiki/MathLibraryTutorial
    数学库源码: http://www.lua.org/source/5.1/lmathlib.c.html

    原文链接:http://blog.csdn.net/zhangxaochen/article/details/8095007
    {{OVER}}

  • 相关阅读:
    Setvlet基础(三) ServletContext
    Servlet基础(二) Servlet的生命周期
    Servlet基础(一) Servlet简介 关键API介绍及结合源码讲解
    JS执行队列
    this指向问题
    发送短信案例
    倒计时
    2:定时器
    1_2:调整窗口大小事件 [ onresize ]
    1_1:页面加载事件 [ window.onload ]
  • 原文地址:https://www.cnblogs.com/yanzi-meng/p/9112079.html
Copyright © 2011-2022 走看看