gpt4 book ai didi

c# - 通过随机数生成确保均匀(ish)分布

转载 作者:太空宇宙 更新时间:2023-11-03 22:27:57 27 4
gpt4 key购买 nike

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

我想知道是否有一种方法可以确保随机值并不总是相似。

例子。

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

我并不是特别想要队列 1 和队列 2 中的所有项目在任何其他项目之前。有保证的方法可以做到这一点吗?

谢谢

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

所以我有Queue1 = "set1_1.xml", set1_2.xml", ... "set1_n.xml"队列 2 ......队列N

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

目前我只是在 0 到(队列数)上使用一个简单的随机数来确定下一个要出队的文件。这行得通,但我问的是是否有可能获得更多的一致性,而不是从队列 1 和队列 2 中获取 50 个文件,然后从队列 3 中获取 5 个文件。

我确实意识到改变随机性不再使它随机。

感谢您的所有回答。

最佳答案

嗯,目前还不完全清楚场景是什么,但随机性是你永远无法分辨的;-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;
}

关于c# - 通过随机数生成确保均匀(ish)分布,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/519891/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com