我有一个间隔为1000毫秒的计时器。我想在随机时间做一些事情,但是在给定的时间范围内。例如。如果我指定时间范围为例如10秒,1-10,11-20,21-30等。这意味着在前10秒内,第1帧在第1帧到第10帧之间随机发生。例如。可能发生在第二秒或第八秒。然后再次从11到20秒,在第二时间帧之间的任何时间再次发生某事。例如。这可能是第13或第15秒。 注意,计时器必须是连续的,例如从1到100秒。如果我将时间范围指定为10,那么我们将有十个时间帧。 1-10,11-20,21-30 .... 91-100。因为我需要知道将要发生的事件的确切时间。因此,不要认为重置计时器可能会解决问题。
感谢您的回复,非常感谢您解释的例子。
答案 0 :(得分:0)
你的问题不是很明确,所以让我假设某事将作为函数发生。让我们说[{1}}发生在[1-10],func1
发生在[11-20],依此类推。
func2
的函数,输出random
(判断是否执行)。bool
,flag1
,...)。flag2
),并将每个timer.tick 在这里使用一些条件:
count
等等
答案 1 :(得分:0)
只需跟踪每个帧的实际偏移量,并在生成新的事件时间时将其考虑在内:
void RunEvents(TimeSpan interval, TimeSpan duration)
{
Random random = new Random();
TimeSpan eventOffset = new TimeSpan();
Stopwatch sw = Stopwatch.StartNew();
while (sw.Elapsed < duration)
{
TimeSpan nextEvent = eventOffset +
TimeSpan.FromSeconds(random.NextDouble() * interval.TotalSeconds);
TimeSpan delay = nextEvent - sw.Elapsed;
if (delay.Ticks > 0)
{
Thread.Sleep(delay);
}
eventOffset += interval;
}
}
换句话说,通过将上一个事件之后的前一个时间间隔中剩余的时间加到当前时间间隔的开始时间以及实际时间间隔内的随机时间长度来计算nextEvent
。 / p>
然后,在现在和下一个事件之间等待足够的时间。
最后,更新偏移和间隔余数,以便它们可用于下一轮。
注意:
eventOffset
和sincePrevious
合并为一个值。但是现在已经很晚了,我觉得这很容易留给读者作为练习。 :)sincePrevious
!叹。代码已经过编辑以纠正我的错误。Thread.Sleep()
作为延迟。恕我直言,最好是制作方法async
并使用Task.Delay()
代替。但是我想保持这个例子简单,并且没有办法从问题中知道究竟什么是处理延迟本身的最佳方法。答案 2 :(得分:0)
我不认为前3个答案中的任何一个都是正确的,所以让我试试:你所说的是时间在流逝,在N秒的每一片中,你想要一个随机发生的事件在那片中的时间。如果是这种情况,那么每当时间是N秒的倍数时,获得0到N之间的随机数,并在那时生成事件。例如,在伪代码中:
time = 0
delta_time = 1 second
max_time = 100 seconds
slice_time = 10 seconds
// decide when event of first slice will occur; can't be at 0: get random #
// in range [delta_time, slice_time]:
next_rand_time = random(delta_time, slice_time)
setup timer to fire at interval of delta_time, each time do the following (callback):
time += delta_time
// is it time to fire the event yet? allow for round-off error:
if abs(time - next_rand_time) < 0.0001:
generate event
// is it time to decide when next random event will be?
if modulo(time, slice_time) == 0:
// can't be on left boundary; get random # in range [delta_time, slice_time]:
next_rand_time = time + random(delta_time, slice_time)
5个变量(time,delta_time等)可能是使用计时器的类的数据成员,而回调将是该类的方法。在帖子中提供一些代码以获取更多详细信息。