当前位置: 首页 > 面试题库 >

映射迭代是否足够随机以随机选择密钥?

嵇弘新
2023-03-14
问题内容

我可以依靠地图的随机迭代顺序在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个时,这是否足够?还是应该维护一个单独的客户端片段并从中随机选择?


问题答案:

尽管它说是随机的(随机的)(spec,blog,hashmap源,另一个blog,SO),但分布远非完美。

为什么?因为我们喜欢地图
,并且更好的随机分布往往需要更多的计算和/或更大的延迟。必须做出妥协。并且,因为这样做的目的不是通过提供高质量的“混洗”功能for range,而只是为了防止开发人员依赖稳定的迭代顺序(因为即使没有显式随机化,它也会发生变化)。

但是这种分布有多“好”呢?容易获得“味道”。让我们创建一个包含10对的地图,并开始对其进行多次迭代。让我们计算一下第一个索引(键)的分布:

m := map[int]int{}
for i := 0; i < 10; i++ {
    m[i] = i
}

dist := make([]int, 10)
for i := 0; i < 100000; i++ {
    for idx := range m {
        dist[idx]++
        break
    }
}

fmt.Println("Distribution:", dist)

输出(在Go Playground上尝试):

Distribution: [25194 24904 6196 6134 6313 6274 6297 6189 6189 6310]

前两个键(01)碰到的几率大约是其余两个键的 几倍 ,后者的几率大致相同。

您可以说这对于真正的(甚至是好的)随机性是很不好的,但这不是重点。它足以提供不同的迭代顺序(而且很重要:很快速)。



 类似资料:
  • 问题 你想从一个序列中随机抽取若干元素,或者想生成几个随机数。 解决方案 random 模块有大量的函数用来产生随机数和随机选择元素。 比如,要想从一个序列中随机的抽取一个元素,可以使用 random.choice() : >>> import random >>> values = [1, 2, 3, 4, 5, 6] >>> random.choice(values) 2 >>> random

  • 问题内容: 有没有一种方法可以随机选择一个功能? 例: 上面的代码似乎执行所有3个功能,而不仅仅是随机选择的一个。正确的方法是什么? 问题答案: Python函数是一流的对象:您可以按名称引用它们,而无需调用它们,然后在以后调用它们。 在您的原始代码中,您要调用这三个代码,然后在结果中随机选择。在这里,我们随机选择一个函数,然后调用它。

  • 问题内容: 当您要依次遍历数字列表时,您将编写: 但是,如果要随机遍历范围(0..999)的数字列表怎么办?需要(在每个迭代中)随机选择在任何先前迭代中未选择的数字,并且需要对范围(0..999)内的所有数字进行迭代。 你知道该怎么做(聪明)吗? 问题答案: 您可以习惯随机播放列表: 顺便说一句,在许多情况下,您将在其他编程语言中使用整数范围内的循环,则可以直接描述要在Python中迭代的“事物”

  • 问题内容: 我不知道我只是在错误的地方还是在什么地方找东西,但是活动记录是否具有检索随机对象的方法? 就像是? 或者…好吧,因为这种方法不存在,所以有一些惊人的“ Rails Way”来做到这一点,我似乎总是很冗长。我也使用mysql。 问题答案: 在Rails 4中,我将扩展: 这样,您可以使用范围:

  • 随机抽样,是统计学中常用的一种方法,它可以帮助我们从大量的数据中快速地构建出一组数据分析模型。在 Pandas 中,如果想要对数据集进行随机抽样,需要使用 sample() 函数。 sample() 函数的语法格式如下: 参数说明如下表所示: 参数名称 参数说明 n 表示要抽取的行数。 frac 表示抽取的比例,比如 frac=0.5,代表抽取总体数据的50%。 replace 布尔值参数,表示是

  • 问题内容: 假设我有一个看起来像这样的数据框: 如何才能为每一行随机选择一个(或多个)行?假设我希望每人随机抽取一次,我将得到: 问题答案: