DateTime.Now.DayOfYear不按预期运行,导致作为随机种子出现问题

时间:2011-02-24 12:26:30

标签: c# datetime random seed

我正在使用以下方法从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作为种子的原因是因为我想在每天方法执行时选择相同的sectorId,第二天我会选择一个不同的随机区域。

这在一定程度上有效,但并不完美。例如昨天早上和前一天晚上它一直选择一个扇区ID,然后在昨天它开始选择一个不同的扇区ID,今天它仍然使用与昨天下午相同的扇区ID。

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

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

2 个答案:

答案 0 :(得分:3)

除非在方法调用期间白天更改,否则您将始终只返回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序列本身是否稳定。

答案 1 :(得分:1)

我建议你这样做:

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

由于 Neelesh