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