1

我有一个对象列表,我想以随机顺序连续访问这些对象。

我想知道是否有办法确保随机值并不总是相似。

例子。

我的列表是一个队列列表,我试图将这些值交错以产生一个用于测试的真实场景。

我并不特别希望队列 1 和 2 中的所有项目都排在任何其他项目之前。有没有保证的方法来做到这一点?

谢谢

编辑 :: 我拥有的队列列表基本上是我正在传输到网络服务的文件列表。文件需要按特定顺序排列,因此需要队列。

所以我有 Queue1 = "set1_1.xml", set1_2.xml", ... "set1_n.xml" Queue2 ... ... QueueN

虽然每个文件都需要根据其队列中的其他文件按顺序传输,但我想模拟一个真实世界的模拟,其中文件将在不同时间从不同来源接收,因此它们交错。

目前我只是在 0 到(队列数)上使用一个简单的 rand 来确定下一个要出列的文件。这行得通,但我在问是否有可能获得更多的统一性,而不是从队列 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;
            }
        }
    }
}

这在整个集合中应该是相当统一的。这里的技巧是,通过将队列视为单个大队列,趋势是具有大量项目的队列将更快地出队(因为在其范围内获得索引的机会更大)。这意味着它应该自动平衡队列之间的消耗,以便它们在(大致)同时耗尽。如果您没有 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 回答
0

您是否正在尝试洗牌?

如果是这样,您可以通过按随机值对其进行排序来做到这一点。

尝试这样的事情:

private Random random = new Random();
public int RandomSort(Queue q1, Queue q2)
{
  if (q1 == q2) { return 0; }
  return random.Next().CompareTo(random.Next());
}

然后在调用 List.Sort(); 时使用 RandomSort 作为参数;

于 2009-02-06T11:32:25.827 回答
0

如果要排队的项目有一个 GetHashCode() 算法,该算法将值均匀地分布在所有整数上,您可以对哈希值使用取模运算符来指定要将项目添加到哪个队列。这与哈希表用于确保值的均匀分布的原则基本相同。

于 2009-02-06T11:33:22.360 回答