DateTime.Now.DayOfYear не работает должным образом, вызывая проблемы как случайное начальное число - PullRequest
0 голосов
/ 24 февраля 2011

Я использую следующий метод для получения случайного значения из списка идентификаторов.

    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 каждый раз, когда метод выполняется в течение дня, а на следующий день я выбираю другой случайныйодин.

Это работает до некоторой степени, но это не идеально.Например, вчера утром и накануне вечером он последовательно выбирал идентификатор одного сектора, затем вчера в какой-то момент он начал выбирать другой идентификатор сектора, и сегодня он все еще использует тот же идентификатор сектора, который использовался вчера днем.

Я думал, что DateTime.Now.DayOfYear изменится в полночь по Гринвичу (мой текущий часовой пояс), но это не так.

Может ли кто-нибудь подсказать мне, если DateTime.Now.DayOfYear ведет себя не так, как я ожидаюк?Если да, есть ли способ изменить это так, чтобы я мог каждый день в полночь выбирать новый идентификатор Сектора из списка?

Ответы [ 2 ]

3 голосов
/ 24 февраля 2011

Если день не изменится во время вызова метода, вы всегда будете просто возвращать последний идентификатор в 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)];
}

Это будет выбрать тот же элемент по позиции каждый раз.Будет ли он на самом деле возвращать тот же идентификатор сектора, будет зависеть от того, стабильна ли сама последовательность sectorIds.

1 голос
/ 24 февраля 2011

Я предлагаю вам сделать это так:

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

Спасибо Neelesh

...