gpt4 book ai didi

c# - 每秒生成一个事件 X 次,但在每秒内间隔不均匀

转载 作者:行者123 更新时间:2023-11-30 18:37:47 29 4
gpt4 key购买 nike

我想编写一个类,该类将每秒触发一个事件 x 预定义的次数,称之为 n

但是,我希望 x NO 在每一秒内均匀地发射。

因此,假设 n = 100,可能会在前 300 毫秒内触发 25 个,然后在接下来的 600 毫秒内触发 50 个,最后 25 个在剩余的 100 毫秒内触发。

理想情况下,我想要比上面呈现的更好的粒度以及每秒内更大范围的间距。

我想知道我是否能够创建一个具有定义的毫秒数以及要触发多少事件的数组。然后使用循环和 Stopwatch 类来确定是否应该触发为该毫秒路标定义的事件。

问题是,是否可以足够快地计算每一秒的数组,每一秒应该有随机间距。

显然,该事件需要是异步的,以避免被连接到它的任何东西延迟。

有人遇到过类似的需求吗?

更新

我想我至少会把最初的努力放在这里。

所以我发现有足够的分辨率来检查你当前在第几毫秒和第几秒。基本上,每一秒我重建我的间距,每毫秒都会在数组中获得一个条目,每个条目表示在该毫秒内触发事件的次数。

我的问题是间距......我需要一种更好的方法来尝试聚集事件计数,目前这个 jsut 似乎将它们均匀地放置在 0、1 或 2 中。

public delegate void EmptyEventDelegate();
public class RandEvent
{
public event EmptyEventDelegate OnEvent = delegate { };
private bool running = false;
Random r = new Random();

private int eventsPS;

public RandEvent(int eventsPS = 1)
{
this.eventsPS = eventsPS;
}

public void Start()
{
running = true;
Task.Factory.StartNew(() =>
{
Run();
});
}

private void Run()
{
var sw = new Stopwatch();
sw.Start();

int currentSecond = 0;
int[] eventCount = BuildEventSpacing();

while(running)
{
if (currentSecond != sw.Elapsed.Seconds)
{
currentSecond = sw.Elapsed.Seconds;
eventCount = BuildEventSpacing();
}
else
{
for(int i = 0; i < eventCount[sw.Elapsed.Milliseconds]; i++)
OnEvent();

}
}

sw.Stop();
}

private int[] BuildEventSpacing()
{
var array = new int[1000];

for (int i = 0; i < eventsPS; i++)
{
array[r.Next(0, 999)]++;
}

return array;
}

public void Stop()
{
running = false;
}

}

最佳答案

创建随机事件时间数组:

  1. 选择事件之间的最小时间间隔,并用所有可能的事件时间填充一个数组。例如,如果您选择 1 毫秒的粒度,则该数组将具有 1000 个值:0、0.001、0.002、...、0.999。
  2. 每秒打乱数组以随机化元素的顺序。
  3. 使用数组的前 n 个元素作为事件的触发时间。

关于c# - 每秒生成一个事件 X 次,但在每秒内间隔不均匀,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12202681/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com