1

オブジェクトのリストがあり、ランダムな順序で継続的にオブジェクトにアクセスしたいと考えています。

ランダムな値が常に似ているとは限らないことを保証する方法があるかどうか疑問に思っていました.

例。

私のリストはキューのリストであり、値をインターリーブして、テスト用の実際のシナリオを作成しようとしています。

特に、キュー 1 と 2 のすべてのアイテムを他のアイテムの前に置きたいわけではありません。これを行う保証された方法はありますか?

ありがとう

編集::私が持っているキューのリストは、基本的に、Webサービスに送信しているファイルのリストです。ファイルは特定の順序である必要があるため、キューがあります。

だから私は Queue1 = "set1_1.xml", set1_2.xml", ... "set1_n.xml" Queue2 ... ... QueueN を持っています

各ファイルはキュー内の他のファイルに関して順番に送信する必要がありますが、ファイルが異なるソースから異なる時間に受信され、インターリーブされる現実世界のシミュレーションをシミュレートしたいと思います。

現時点では、次にデキューするファイルを決定するために、0 から (キューの数) までの単純なランドを使用しています。これは機能しますが、キュー 1 と 2 から 50 個のファイルを取得し、キュー 3 から 5 個のファイルを取得するのではなく、もう少し均一性を得るために離れていた可能性があるかどうかを尋ねていました.

ただし、ランダム性を変更してもランダムにならないことは認識しています。

ご回答ありがとうございます。

4

4 に答える 4

2

まあ、シナリオが何であるかは完全には明らかではありませんが、ランダムであることは決してわかりません ;-p。薄さを「保証」するために何をしようとしても、おそらくランダム性が低下します。

いかがですか?個人的には、次のようにします。

static IEnumerable<T> GetItems<T>(IEnumerable<Queue<T>> queues)
{
    int remaining = queues.Sum(q => q.Count);
    Random rand = new Random();
    while (remaining > 0)
    {
        int index = rand.Next(remaining);
        foreach (Queue<T> q in queues)
        {
            if (index < q.Count)
            {
                yield return q.Dequeue();
                remaining--;
                break;
            }
            else
            {
                index -= q.Count;
            }
        }
    }
}

これは、セット全体でかなり均一になるはずです。ここでの秘訣は、キューを 1 つの大きなキューとして扱うことによって、多くのアイテムを含むキューがより迅速にデキューされる傾向があるということです (その範囲内でインデックスを取得する可能性が高くなるため)。これは、すべてのキューが (ほぼ) 同時に空になるように、キュー間の消費量を自動的に調整する必要があることを意味します。LINQ がない場合は、最初の行を変更するだけです。

int remaining = 0;
foreach(Queue<T> q in queues) {remaining += q.Count;}

使用例:

static void Main()
{
    List<Queue<int>> queues = new List<Queue<int>> {
        Build(1,2,3,4,5), Build(6,7,8), Build(9,10,11,12,13)
    };
    foreach (int i in GetItems(queues))
    {
        Console.WriteLine(i);
    }
}
static Queue<T> Build<T>(params T[] items)
{
    Queue<T> queue = new Queue<T>();
    foreach (T item in items)
    {
        queue.Enqueue(item);
    }
    return queue;
}
于 2009-02-06T11:11:32.047 に答える
2

それはあなたが本当に欲しいものに依存します...

「ランダム」値が本当にランダムである場合、十分な反復で均一な分布が得られます。

分布を制御または操作することについて話している場合、値は真にランダムではなくなります!

したがって、次のいずれかを使用できます。

  • 一様分布の真にランダムな値、または
  • 制御された配布ですが、完全にランダムではなくなりました
于 2009-02-06T11:13:09.810 に答える