我想在一个范围内选择一个随机数,但是说生成的数字是'x',下次我希望数字至少为x±20。我怎样才能做到这一点?
math.random()
只需要两个参数,因此如果在第1行中,选择的数字是40,则秒数应该是50或更多/ 30或更少,同样下次应该是60或更多/ 20或更少。
答案 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)
。