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している理由は、メソッドが1日実行されるたびに同じセクターIDを選択し、翌日は別のランダムなIDを選択するためです。

これはある程度機能しますが、完璧ではありません。たとえば、昨日の朝と前夜は一貫して単一のセクターIDを選択していましたが、昨日のある時点で別のセクターIDの選択を開始しましたが、今日でも昨日の午後と同じセクターIDを使用しています。

グリニッジ標準時の深夜0時(現在のタイムゾーン)に変更されると思いDateTime.Now.DayOfYearましたが、そうではないようです。

DateTime.Now.DayOfYear予想とは異なる動作をした場合、誰かが私に記入できますか?もしそうなら、毎日深夜にリストから新しいセクターIDを確実に選択できるように、これを変更する方法はありますか?

4

2 に答える 2

2

メソッドの呼び出し中に日付が変わらない限り、常に最後の ID を返すだけですsectorIdsRandom反復ごとに (同じシードで)の新しいインスタンスを作成しているため、毎回同じキーを置き換えることになります。私はそれがあなたが望むものだとは思わない...

はるかに単純なアプローチは次のようになると私には思えます。

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;

ありがとうNeelesh

于 2011-02-24T12:41:11.317 に答える