10

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

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

有人得到我所追求的吗?;-) 任何关于如何实现这种行为的想法都将不胜感激。

4

3 回答 3

9

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

例如,而不是:

windspeed = random (100)                # 0 thru 99 inclusive

使用类似的东西:

windspeed = windspeed - 4 + random (9)  # -4 + 0..8 gives -4..4
if   windspeed > 99: windspeed = 99
elif 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)
于 2012-10-03T08:30:36.597 回答
3

Perlin(或更好的单纯形)噪声将是生成平滑噪声时首先想到的方法。它返回一个介于 1 和 -1 之间的数字,它将与当前值相加或相减。您可以将其倍增以使其看起来不那么微妙或更好……使最低风值 -1 和最高风值 1。

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

于 2013-03-31T23:08:23.953 回答
0

我创建了一个新版本的平滑随机数。这个想法是我们的​​随机数将在限制范围内 = [平均 - 振荡,平均 + 振荡],并且每次都会改变 [-varianciance,+variance]。

但是,如果它达到极限,我们的方差将会减少。

例如来自 [0, 100] 的数字,方差为 10。如果当前值 = 8,则方差将为 [0, 18]

蟒蛇代码:

def calculate_smooth_random(current_value, average, oscillation, variance):
    max_value = average + oscillation
    min_value = average - oscillation

    max_limit = min(max_value, current_value + variance)
    min_limit = max(min_value, current_value - variance)
    total_variance = max_limit - min_limit

    current_value = min_limit + random.random() * total_variance

    print("current_value: {}".format(current_value))
    return current_value

具有值的分布图像:平均:20 振荡:10 方差:5

在此处输入图像描述

于 2022-01-05T09:02:31.633 回答