c# - 每个用户在一个窗口内选择随机时间的算法

标签 c# algorithm random

我需要每天随机选择 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/

相关文章:

javascript - D3 条形图未填充。

c# - 从脚本组件 (SSIS) 调试 .NET dll

javascript - JQuery 验证失败后页面仍然回发

algorithm - 无监督分类——得到特征向量

java - Coin Change - Java 无法通过示例 3

java - 如何生成半随机颜色列表?

c# - 随机移动物体而不在墙内 - Unity 5

c# - C# 中是否有任何存储优化的稀疏矩阵实现?

c# - 如何避免使用 A* 寻路偷工减料?

algorithm - 最大异或与最接近的数字