zoukankan      html  css  js  c++  java
  • lua连续随机数

    号外:惭愧,工作后几乎没有写博客了,其实是有时间的(每周单休),只是厌烦对着屏幕了,还有懒。

       现在老板换人了,时间会多点,估计正常就每周双休了,决定还是每周写两篇(不一定是love2d),

       写不出就翻译老外的。

    有两种方法:

    1、把生成的数放到一个表里面,每次随机时判断这个表里是否有,若有再随机一次

    2、先生成一个连续的数字表t,每次随机一个数n,把t[n]保存,并移除t[n]

    代码如下:

    --产生1~~m,若有n的则m~~n的数字表
    function table.fillNum(m,n)
        local j,k
        if n then
           j=m
           k=n
        else
            j=1
            k=m
        end
    
        local t={}
        for i=j,k do
            table.insert(t,i)
        end
        return t
    
    end
    
    
    --产生不相同的从m到n,一共cnt个随机数表
    function math.randomx( m,n,cnt ) --方法1
        if cnt>n-m+1 then
            return {}
        end
        local t = {}
        local tmp = {}
        math.randomseed(os.time())
        while cnt>0 do
            local x =math.random(m,n)
            if not tmp[x] then
                t[#t+1]=x
                tmp[x]=1
                cnt=cnt-1
            end
        end
        return t
    end
    --同上
    function math.randomEx(m,n,cnt) --方法2
        if cnt>n-m+1 then
            return {}
        end
        local x=0
        local t={}
        local tmp=table.fillNum(m,n)
        math.randomseed(os.time())
        while  cnt>0 do
           x=math.random(1,n-m+1) 
           table.insert(t,tmp[x])
           table.remove(tmp,x)
           cnt=cnt-1
           m=m+1
          
        end
        return t
    end
    
    
    t=math.randomx(11, 25, 6)
    for i=1,6 do
      print(t[i])
    end
    print("...........")
    t=math.randomEx(11, 25, 6)
    for i=1,6 do
      print(t[i])
    end

    性能测试:

    t1=os.clock()
    for i=1,10000 do
      math.randomEx(11,15,5)
    end
    t2=os.clock()
    for i=1,10000 do
      math.randomx(11,15,5)
    end
    t3=os.clock()
    print((t3-t2)-(t2-t1))

    两种方法差别不是很大,而且当在10000后再加2个0时,就需要很长时间了,或者挂掉。

    如果需要在相隔较短的时间内生成相差较大的随机数可以把math.randomseed(os.time())

    替换为math.randomseed(tostring(os.time()):reverse():sub(1, 6))。

    因为在相隔较短时间时os.time()相差不大,reverse可以把字符串倒转,这样就相差大了,详见此文

  • 相关阅读:
    在JavaScript中对HTML进行反转义
    JavaScript 删除数组中的对象
    CSS中的before和:after伪元素深入理解
    关于css浮动的一点思考
    前端常见跨域解决方案(全)
    window.location对象详解
    51nod 1001 数组中和等于K的数对
    51nod 1002 数塔取数问题
    51nod 1015 水仙花数
    51nod 1080 两个数的平方和
  • 原文地址:https://www.cnblogs.com/xdao/p/lua_random.html
Copyright © 2011-2022 走看看