“平滑”随机数的算法

时间:2012-10-03 08:22:31

标签: c# random

有人能给我一个关于如何生成“平滑”随机数的提示吗? 这就是我的意思:光滑:

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

有人得到我想要的东西吗? ;-) 任何关于如何实现这种行为的想法都将受到赞赏。

2 个答案:

答案 0 :(得分:4)

如果您希望delta(更改)较小,只需为delta生成一个小的随机数。

例如,而不是:

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)

答案 1 :(得分:0)

Percl(或更好的单纯形)噪声是产生平滑噪声时首先想到的方法。它返回1到-1之间的数字,它将在当前值中加或减。你可以多次使它看起来不那么微妙或更好......制作最低风值-1和最高风值1.

然后简单地将播种机作为计数器(1,2,3 ...等),因为perlin / simplex输入保持值“平滑”。