在特定时间范围内随机做一些事情

时间:2014-12-22 07:18:48

标签: c# .net timer simulation

我有一个间隔为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。因为我需要知道将要发生的事件的确切时间。因此,不要认为重置计时器可能会解决问题。

感谢您的回复,非常感谢您解释的例子。

3 个答案:

答案 0 :(得分:0)

你的问题不是很明确,所以让我假设某事将作为函数发生。让我们说[{1}}发生在[1-10],func1发生在[11-20],依此类推。

  • 实现一个名为func2的函数,输出random(判断是否执行)。
  • 为每个时间间隔bin定义一组标志,以跟踪我们是否已执行此期间的指定功能(boolflag1,...)。
  • 将您的timer.Interval设置为1秒
  • 定义一个全局变量(flag2),并将每个timer.tick
  • 增加1
  • 在这里使用一些条件:

    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>

然后,在现在和下一个事件之间等待足够的时间。

最后,更新偏移和间隔余数,以便它们可用于下一轮。

注意:

  1. 以上假设你完全免除了计时器本身,而是使用上面的代码。如果这不合适,那么您应该更具体地说明计时器本身应该如何与您随机生成的事件相关。
  2. 编辑: 我有一种模糊的感觉,我可以将eventOffsetsincePrevious合并为一个值。但是现在已经很晚了,我觉得这很容易留给读者作为练习。 :)我终于弄清楚为什么这会让我烦恼:我根本不需要上面的sincePrevious!叹。代码已经过编辑以纠正我的错误。
  3. 以上使用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等)可能是使用计时器的类的数据成员,而回调将是该类的方法。在帖子中提供一些代码以获取更多详细信息。