C# “的算法”;“平滑”;随机数

C# “的算法”;“平滑”;随机数,c#,random,C#,Random,有谁能给我一个关于如何生成“平滑”随机数的提示吗? 以下是我所说的平滑的意思: 在游戏中应使用随机数,例如风向和强度(有人记得古旧的“蠕虫”吗?)。当然,每隔一秒钟左右为这些值设置一个随机数看起来会非常不稳定。 我宁愿在给定的值范围内有某种平滑的振荡。有点像正弦波,但更随机 有人得到我想要的吗?;-) 任何关于如何实现这种行为的想法都将不胜感激。如果您希望增量(更改)较小,只需为增量生成一个小的随机数即可 例如,而不是: windspeed = random (100)

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

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

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

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

例如,而不是:

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
Perlin(或更好的单纯形)噪声将是生成平滑噪声时想到的第一种方法。它返回一个介于1和-1之间的数字,该数字将与当前值相加或相减。你可以把它放大,让它看起来不那么微妙或者更好。。。使最低风值为-1,最高风值为1


然后简单地使用播种机作为计数器(1,2,3…等),作为柏林/单工输入,保持值“平滑”。

如果要模拟风,您可能需要一个随机数来告诉您何时更改风向。当这种随机时间事件发生时,改变风向,但将风向限制在某个角度和速度(再次随机),因此只需在某个范围内选择随机数,并以每秒+=1(0.0-5.0随机)的变化为基础(0-3秒再次随机lol)等,直到它们在一定时间内达到0-180度的随机变化,这也是随机的。很简单,但完全取决于你如何实施这些时间和程度变化等。@Jodrell Benford定律在这里完全不适用。分布之后的问题可能是一个有趣的问题,但本福德定律只是描述了一种数值现象,它没有描述连续的随机数分布(它确实描述了可以从中取样的离散分布——但为什么要挑出这种特殊分布?).你可以把风表示成一个向量,然后用随机值做一个移动平均。这将使波动与你平均的样本量成比例地平滑。@KonradRudolph,删除评论。我只是指出随机性可能意味着不同的东西。但是风速不可能停留在上限或下限吗?@Boris,是的,你的观点是什么?这也是随机天气可能做的:-)如果你想确保它朝向一个特定的值(比如50),只需对随机数进行加权即可。或者查看我的更新,它将所需的值与增量断开。
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)