我需要每天随机选择 N 个事件,但它们之间不能太接近 (M)。因此,N 个事件必须在特定窗口 (W) 内至少相隔 M。在这种情况下,我想到的窗口是 12 小时。
- N = 事件数
- T = 事件应该发生的时间 (UTC)
- M = 他们应该分开的最小因数(小时)。
- W = 事件窗口(从现在到现在 + 12 小时)。
- U = 用户(可能对这个问题不重要)
我可能会解决这个问题,但我认为这将是一个有趣的 StackOverflow 问题,并且对人们如何解决它很感兴趣。
提前致谢:)
更新:将答案移至答案
最佳答案
试试这个:
它随机拆分可用时间(窗口 - 计数 * 最小值),然后对时间进行排序并添加最小量以产生最终事件数组 T[]
。
static Random rnd=new Random();
static void Main(string[] args)
{
double W=12;
double M=1.0;
int N=7;
double S=W-(N-1)*M;
double[] T=new double[N];
for(int i=0; i<N; i++)
{
T[i]=rnd.NextDouble()*S;
}
Array.Sort(T);
for(int i=0; i<N; i++)
{
T[i]+=M*i;
}
Console.WriteLine("{0,8} {1,8}", "#", "Time");
for(int i=0; i<N; i++)
{
Console.WriteLine("{0,8} {1,8:F3}", i+1, T[i]);
}
// With N=3, Window 12h, Min. Span = 5h
// # Time
// 1 0.468
// 2 5.496
// 3 10.529
// With N=7, Window 12h, Min. Span = 1h
// # Time
// 1 0.724
// 2 2.771
// 3 4.020
// 4 5.790
// 5 7.331
// 6 9.214
// 7 10.673
}
同样作为检查,当最短时间完全覆盖时间窗口时,事件间隔相等。因此,对于 12 小时窗口上的 3 个事件,最短时间为 6 小时,此算法会按预期在 0.0、6.0 和 12.0 处生成事件。
关于c# - 每个用户在一个窗口内选择随机时间的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15577104/