【问题标题】:Algorithm for "smooth" random numbers“平滑”随机数的算法
【发布时间】:2012-10-03 08:22:30
【问题描述】:

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

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

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

【问题讨论】:

  • 如果你想模拟风,你可能需要一个随机数来告诉你什么时候改变风向。当这个随机时间事件发生时改变风向,但将方向限制在一定的角度和速度(再次随机),所以只需选择一定范围内的随机数并逐渐建立 +=1(0.0 - 5.0 随机)每秒(0-3 秒随机再次大声笑)等,直到它们在一定时间内达到 0-180 度的随机变化,这又是随机的。很简单,但完全取决于你如何实现这些时间和程度变化等。
  • @Jodrell Benford 定律在这里完全不适用。分布之后的问题可能是一个有趣的问题,但本福德定律只是描述了一种数值现象,它没有描述一个连续的随机数分布(它确实描述了一个可以从中采样的离散分布——但为什么要挑出这个特定的分布呢? )。
  • 您可以将风表示为矢量并使用随机值进行移动平均。这将根据您平均的样本量按比例消除波动。
  • @KonradRudolph,评论已删除。我只是指出随机可能意味着不同的东西。

标签: c# random


【解决方案1】:

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

例如,而不是:

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)

【讨论】:

  • 但是风速不会卡在上限或者下限吗?
  • @Boris,是的,你的意思是什么?这也是随机天气可能会做的事情 :-) 如果您想确保它倾向于特定值(如 50),只需加权随机数即可实现。
  • 或者查看我的更新,它将所需值与增量断开连接。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

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

    python 代码:

    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

    【讨论】:

      猜你喜欢
      • 2012-10-25
      • 1970-01-01
      • 2012-10-10
      • 2011-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多