0

我正在使用以下方法从 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。

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

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

4

2 回答 2

2

除非在方法调用期间日期发生变化,否则您总是将返回最后一个 id in sectorIds。您每次都将替换相同的密钥,因为您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序列本身是否稳定。

于 2011-02-24T12:34:05.007 回答
1

我建议你这样做:

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

谢谢尼莱什

于 2011-02-24T12:41:11.317 回答