【问题标题】:DateTime.Now.DayOfYear not behaving as expected, causing problems as a Random seedDateTime.Now.DayOfYear 未按预期运行,导致随机种子出现问题
【发布时间】:2011-02-24 12:26:29
【问题描述】:

我正在使用以下方法从 ID 列表中获取随机值。

    private int GetRandomDateBasedSectorId(IEnumerable<int> sectorIds)
    {
        var randomSortTable = new Dictionary<int, int>();

        foreach (int id in sectorIds)
            randomSortTable[new Random(DateTime.Now.DayOfYear).Next()] = id;

        return randomSortTable.OrderBy(KVP => KVP.Key).Select(KVP => KVP.Value).FirstOrDefault();
    }

我使用DateTime.Now.DayOfYear 作为种子的原因是因为我想在一天内每次执行该方法时都选择相同的扇区ID,而第二天我会随机选择一个不同的扇区ID。

这在一定程度上可行,但并不完美。例如,昨天早上和前一天晚上它一直在选择单个扇区 ID,然后在昨天的某个时间点开始选择不同的扇区 ID,而今天它仍在使用昨天下午使用的相同扇区 ID。

我认为DateTime.Now.DayOfYear 会在格林威治标准时间午夜(我当前的时区)发生变化,但似乎并非如此。

如果DateTime.Now.DayOfYear 的行为与我预期的不同,有人可以告诉我吗?如果是这样,我有没有办法修改它,以便我可以确保它会在每天午夜从列表中选择一个新的扇区 ID?

【问题讨论】:

  • 您确定机器上设置的时间正确吗?也许它在午夜(操作系统时间)发生了变化,这是几个小时后开始的......
  • 是的,我的机器和我部署到的服务器上的日期和时间都是正确的。
  • DateTime.Now.DayOfYear 在午夜发生变化。所以问题不存在。问题可能出在系统的 DateTime 中。检查它是否正确。

标签: c# datetime random seed


【解决方案1】:

除非在方法调用期间发生变化,否则您总是会返回sectorIds 中的最后一个ID。您每次都将替换相同的密钥,因为您在每次迭代中都创建了 Random 的新实例(具有相同的种子)。我不认为那是你想要的......

在我看来,更简单的方法是:

private int GetRandomDateBasedSectorId(IEnumerable<int> sectorIds)
{
    List<int> ids = sectorIds.ToList();
    Random rng = new Random(DateTime.Now.DayOfYear);
    return ids[rng.Next(ids.Count)];
}

这将每次按位置选择相同的元素。是否真正返回相同的扇区ID,将取决于sectorIds序列本身是否稳定。

【讨论】:

    【解决方案2】:

    我建议你这样做:

    int numberOfItems = randomSortTable.Count;
    int index = (new Random(DateTime.Now.DayOfYear).Next()) % numberOfItems;
    randomSortTable[index] = id;
    

    谢谢 尼利什

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-12
      • 1970-01-01
      • 2020-01-14
      • 2011-05-18
      • 1970-01-01
      • 2014-01-21
      相关资源
      最近更新 更多