当前位置: 首页 > 知识库问答 >
问题:

给定概率的切片/阵列中的Golang选择数

呼延凌
2023-03-14

你好,我正在寻找一种方法来选择数字从数组/切片与给定的概率向量,例如像这样:我们有数据[0,1,2]和概率向量[0.2,0.5,0.3]所以我们选择0与概率0.2,1与概率0.5和2与概率0.3在python我会使用numpy.random.choice.

共有1个答案

金钊
2023-03-14

解决方案就是根据给定的概率(pdf)计算cdf,然后找到正确的桶:

func sample(cdf []float32) int {
    r := rand.Float32()

    bucket := 0
    for r > cdf[bucket] {
        bucket++
    }
    return bucket
}

获取 cdf 由

func main() {
    // probability density function
    pdf := []float32{0.3, 0.4, 0.2, 0.1}

    // get cdf
    cdf := []float32{0.0, 0.0, 0.0, 0.0}
    cdf[0] = pdf[0]
    for i := 1; i < 4; i++ {
        cdf[i] = cdf[i-1] + pdf[i]
    }

    // test sampling with 100 samples
    samples := []float32{0.0, 0.0, 0.0, 0.0}

    for i := 0; i < 100; i++ {
        samples[sample(cdf)]++
    }

    // normalize
    for i := 0; i < 4; i++ {
        samples[i] /= 100.
    }

    fmt.Println(samples)
    fmt.Println(pdf)

}

完整示例:https://play.golang.org/p/ceZx1EiYW3l

< code>sample的输出遵循给定的概率:

samples: [0.33 0.43 0.15 0.09]
pdf: [0.3 0.4 0.2 0.1]
 类似资料:
  • 让我们假设我有一个这样的结构化数组: 我将这个结构称为“categories”,所以,我在这个数组中有六个类别。我的目标是根据一个类别随机挑选一个产品。 我想做一个基于速率的类别选择,据我所知,我必须计算这个类别在数组中代表多少百分比,例如: 这会给我类似的东西: 好的,现在我要做一个简单的算法,根据这些比率得到类别;我想我现在需要在范围之间选择一个随机数,并制作一些“切片”,例如: 如果随机数介

  • 比如说我有一张30000人的名单。我想从一组8种可能的水果中选择4次。然而,我希望任何名字选择任何水果两次的概率是20%。我将如何在代码中进行此操作。 例如:列出30000个水果名称: 苹果 香蕉 橙色 葡萄 猕猴桃 菠萝 西瓜 火龙果 我希望John选择苹果香蕉橙或苹果香蕉橙香蕉或龙果西瓜葡萄或葡萄猕猴桃的概率精确到20%。 换句话说,我希望80%的名字没有选择匹配的水果,20%的名字有一对匹配

  • 我正在构建一个游戏,我想在到之间选择一个随机数,我想让选择一个更高的数字的几率更低。 所以我问了这个问题,根据amit的回答,我写了这样一句话: 输出我在10000次跑步中选择每个数字的次数。 问题是,无论我选择的值是多少,我总是得到相同的输出。 我需要找到一种方法来修复这个算法,以便将影响拾取两个不同值之间的机会比率,而主要思想将保持不变:拾取更高的值将更难。

  • 我想创建一个由任意高度的正方形组成的高度场贴图。给定一个NxN数组,我想要每一个大小为MxM的正方形,其中M 0.2, 0.2, 0.6, 0.6, 0.1, 0.1, 0.2, 0.2, 0.6, 0.6, 0.1, 0.1, 0.5, 0.5, 0.3, 0.3, 0.8, 0.8, 0.5, 0.5, 0.3, 0.3, 0.8, 0.8, 0.6, 0.6, 0.4, 0.4, 0.9,

  • 这个问题在微软的采访中被问到过。非常好奇为什么这些人会问这么奇怪的概率问题? 给定一个兰特(N),一个随机生成器,它生成从0到N-1的随机数。 编辑:请注意,种子不是固定的。 数组A保持不变的概率是多少? 假设数组包含唯一元素。

  • 问题内容: 我进行了以下测试,即打印原始输入切片(过滤后),而没有删除元素,但是最后有一个额外的元素,使输入切片具有相同的长度,即使过滤后应该较短。 我已经看过这篇文档https://github.com/golang/go/wiki/SliceTricks#delete 但是我认为我缺少有关Go的一些技巧,因为似乎我使用的切片方法错误。 如何避免出现“输出片段”?(以正确的方式打印,包含正确的元

  • 给定一个大小为N的非负整数的未排序数组,找到一个与给定数S相加的连续子数组。 输入: 输入的第一行包含一个整数T,表示测试用例的数量。接下来是T测试用例。每个测试用例由两行组成。每个测试用例的第一行是N和S,其中N是数组的大小,S是和。每个测试用例的第二行包含N个表示数组元素的空格分隔整数。 输出: 对于每个测试用例,在新行中,如果sum等于子数组,则从左侧打印第一个出现子数组的开始和结束位置(1

  • 本文向大家介绍python选取特定列 pandas iloc,loc,icol的使用详解(列切片及行切片),包括了python选取特定列 pandas iloc,loc,icol的使用详解(列切片及行切片)的使用技巧和注意事项,需要的朋友参考一下 df是一个dataframe,列名为A B C D 具体值如下: A B C D 0 ss 小红 8 1 aa 小明 d 4 f f 6 ak 小紫 7