使用math.random()随机选择一个数字

时间:2014-06-28 00:22:59

标签: math random lua

我想在一个范围内选择一个随机数,但是说生成的数字是'x',下次我希望数字至少为x±20。我怎样才能做到这一点?

math.random()只需要两个参数,因此如果在第1行中,选择的数字是40,则秒数应该是50或更多/ 30或更少,同样下次应该是60或更多/ 20或更少。

3 个答案:

答案 0 :(得分:1)

不知道LUA,所以我们要去伪代码

t = Math.random(0,60);
if (t > last_value - 20)
    t += 40
last_value = t

答案 1 :(得分:1)

假设您需要x范围内的数字[0,L),使得每个数字与前一个(在Java中)的(循环)距离至少为d

  public static double rand1(double L, double d, double x) {
    double y = x +  d + Math.random() * (L - 2.0 * d) ;
    if (y >= L)
      y -= L;
    return y;
  }

禁止"周期性地"小距离似乎是一种不必要的复杂问题,但它实际上是一种简化:一方面,这种简单的算法在[0,L)中产生均匀分布,而接受的答案则不然。

答案 2 :(得分:0)

如果你有一个“主”对象,你在0和xMax之间随机放置,并且一个或多个“辅助”对象必须放在同一范围内,但至少D远离mainX的主对象,如果存在多个对象,则它们可以彼此靠近,然后尝试:

function getRandPosNotTooCloseToMain(xMax, mainX, D)
    assert(2*D < xMax) -- if false then main too "fat"
    local leftLen = mainX - D
    local rightLen = xMax - (mainX + D)
    local leftSideWins = true -- need some default

    if leftLen < 0 then -- can only place it right side of main
        assert(rightLen > 0)
        leftSideWins = false

    elseif rightLen < 0 then -- can only place it on left side of main
        -- nothing to do, because leftSideWins already true

    else -- there is space on either side of main (both leftLen and rightLen > 0), 
         -- so randomly select one side then return random # on that side
        local ratio = leftLen / (leftLen + rightLen)
        if math.random() > ratio then -- right half wins
            leftSideWins = false
        else -- left side wins, this is the default
        end
    end

    if leftSideWins then 
        return math.random(0, leftLen)
    else
        return mainX + D + math.random(0, rightLen)
    end
end

可以通过以下方式测试:

-- test
math.randomseed(os.time())
local numTests = 100000

-- generate a bunch of values for right side always wins: 
for x=1,numTests do 
    local x = getRandPosNotTooCloseToMain(60, 15, 20)
    assert( x >= 15+20, x ) 
end

-- generate a bunch of values for left side always wins: 
for x=1,numTests do 
    local x = getRandPosNotTooCloseToMain(60, 45, 20)
    assert( x <= 45-20, x ) 
end

-- generate a bunch of values for left side always wins: 
for x=1,numTests do 
    local x = getRandPosNotTooCloseToMain(60, 30, 20)
    assert( x <= 10 or x>= 50, x ) 
end

-- if get this far then all tests passed!
print("Passed!")

所有测试都通过。在您的情况下,您可以通过mainX随机设置math.random(0,xMax)