"平滑"随机数的算法

Bor*_*ris 6 c# random

任何人都可以给我一个关于如何生成"平滑"随机数的提示吗?这就是我的意思:

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

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

pax*_*blo 8

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

例如,而不是:

windspeed = random (100)                # 0 thru 99 inclusive
Run Code Online (Sandbox Code Playgroud)

使用类似的东西:

windspeed = windspeed - 4 + random (9)  # -4 + 0..8 gives -4..4
if   windspeed > 99: windspeed = 99
elif windspeed <  0: windspeed =  0
Run Code Online (Sandbox Code Playgroud)

这样,您的风速仍然保持在所需的范围内,并且只会逐渐变化。

这将适用于速度等绝对值,如果您逐渐改变的是来自固定方向的角度,则也适用于方向。

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


或者,如果您想确保风速以可能较大的增量变化但缓慢,您可以像当前一样生成目标风速,但逐渐向它移动:

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)
Run Code Online (Sandbox Code Playgroud)

  • 但风速不会卡在上限或下限吗? (3认同)
  • @Boris,是的,你的意思是什么?这也是随机天气的作用:-) 如果您想确保它倾向于特定值(例如 50),只需对随机数进行加权即可实现这一目标。 (3认同)