【发布时间】:2016-12-07 14:15:23
【问题描述】:
我能否依靠地图的随机迭代顺序在 Web 应用程序中实现客户端的随机“配对”?我试着环顾四周,但似乎无法找到这种随机性有多随机的细分。
算法看起来像:
var clients map[Client]struct{}
func PairClient(c Client) (Client, error) {
for m := range clients {
if m != c {
return m, nil
}
}
return nil, fmt.Errorf("lobby: insufficient number of clients")
}
当有 >1000 个连接的客户端时这是否足够,或者我应该维护一个单独的客户端切片并从中随机选择?
【问题讨论】:
-
字典迭代顺序通常是插入和哈希冲突顺序的函数,所以如果你需要随机,你可能需要自己引入一些随机性。一种方法是拉出地图的键,随机打乱它们,然后使用打乱的键迭代地图。
-
不保证任何特定的顺序,包括随机。虽然实现目前对输出进行了混洗,但它绝对不是正态分布。
-
谢谢@JimB,我会保留一部分客户并使用它,或者找出比这更有效的解决方案。
-
@matiaselgart 当前的实现实际上明确地随机化了迭代。但这不是标准所保证的。
-
@BrettLempereur:如果比插入和删除更重要,是随机访问,也许使用不同的数据结构。一个简单的排序切片是
O(1)随机访问、O(log n)查找和O(n)插入,这通常很好。
标签: dictionary random go