2012-10-03 79 views
6

任何人都可以给我一个关于如何生成“平滑”随机数的提示吗? 以下是我的意思:平滑:“平滑”随机数算法

随机数字应在游戏中使用,例如:风向和力量(有没有人记得古老的“蠕虫”?)。当然,每秒钟为这些值设置随机数字看起来会非常不稳定。 我宁愿在给定的数值范围内有某种平滑的振荡。有点像正弦波,但更随机。

有没有人得到我后? ;-) 任何想法如何实现这种行为将不胜感激。

+1

如果你想模拟风,你可能会在随机数后告诉你何时改变风向。当这个随机时间事件发生时会改变风向,但将方向限制在一定的角度和速度(又是随机的),所以只需在一定范围内随机选取一个随机数并逐渐建立+ = 1(随机的0.0 - 5.0)每秒一次(0-3秒随机再次哈哈)等,直到它们在一定时间内随机变化0-180度,这也是随机的。很简单,但完全取决于你如何实现这些时间和程度的变化等。 – pengibot

+1

@Jodrell本福德的法律在这里完全不适用。分布之后的问题可能是一个有趣的问题,但本福德定律只是描述一个数值现象,它没有描述连续的随机数分布(它确实描述了可以从中抽样的离散分布 - 但为什么要选出这个特定的分布? )。 –

+0

您可以将风表示为一个矢量,并用随机值进行移动平均。这将平均消除与您平均的样本量成比例的波动。 –

回答

4

如果您希望增量(变化)很小,只需为增量生成一个小的随机数。

例如,而不是:

windspeed = random (100)    # 0 thru 99 inclusive 

使用类似:

windspeed = windspeed - 4 + random (9) # -4 + 0..8 gives -4..4 
if windspeed > 99: 
    windspeed = 99 
if windspeed < 0: 
    windspeed = 0 

这样一来,你的风速仍然保持所需的范围之内,它永远只能逐渐改变。

这将适用于绝对值,如速度,也适用于方向如果你正在逐渐改变的东西是从固定方向的角度。

它可以很好地用于任何测量。


另外,如果你想确保有可能大三角洲风速的变化,但慢慢地,你可以生成你的目标风速为你目前做的,但逐渐走向其移动:

windspeed = 50 
target = windspeed 
while true: 
    # Only set new target if previous target reached. 

    if target == windspeed: 
     target = random (100) 

    # Move gradually toward target. 

    if target > windspeed: 
     windspeed = windspeed + max (random (4) + 1, target - windspeed) 
    else: 
     windspeed = windspeed - max (random (4) + 1, target - windspeed) 

    sleep (1) 
+2

但风速有可能卡在上限或下限? – Boris

+2

@Boris,是的,你有什么意见?这就是随机天气也可以做的事情:-)如果你想确保它吸引到一个特定的值(比如50),只需对随机数进行加权就可以达到这个效果。 – paxdiablo

+0

或者查看我的更新,从增量中断开所需的值。 – paxdiablo

0

佩林(或更好的单纯形)噪声是产生平滑噪声时想到的第一种方法。它返回一个介于1和-1之间的数字,它将从当前值中加上或减去。你可以多倍使它看起来不那么微妙或更好......使最低风值-1和最高风值1.

然后只需要一个播种机作为计数器(1,2,3 ...等等)作为perlin/simplex输入保持值'平滑'。