Go语言:按照指定的一组权重随机选择一个数组元素(加权随机索引)

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情

加权随机索引比较常用,例如HTTP代理服务器需要按照不同的权重把请求转发给不同的后端服务器,又比如在web页面的同一个位置需要按照一定的比例显示不同的广告图片。

函数实现如下:

package main

import (
	"fmt"
	"math/rand"
	"time"
)

/*
  作者:pengpengzhou
  方法:WeightedRandomIndex
  功能:按照指定的一组权重随机返回数组索引
  参数:weights []float32 权重切片
  返回:加权随机索引index,index是 0 ~ len(weights)-1 之间的一个整数

  示例如下:
  按权重[0.1, 0.2, 0.3, 0.4]随机调用1000次该方法,返回0,1,2,3的次数将接近于1:2:3:4

  	var weights = []float32{0.1, 0.2, 0.3, 0.4}
  	var result [4]int
  	rand.Seed(time.Now().Unix())
  	for i := 0; i < 1000; i++ {
  		result[WeightedRandomIndex(weights)]++
  	}
	fmt.Printf("%v\n", result)

  输出:
    [112 174 304 410]
*/
func WeightedRandomIndex(weights []float32) int {
	if len(weights) == 1 {
		return 0
	}
	var sum float32 = 0.0
	for _, w := range weights {
		sum += w
	}
	r := rand.Float32() * sum
	var t float32 = 0.0
	for i, w := range weights {
		t += w
		if t > r {
			return i
		}
	}
	return len(weights) - 1
}

func main() {
	var weights = []float32{0.1, 0.2, 0.3, 0.4}
	var result [4]int
	rand.Seed(time.Now().Unix())
	for i := 0; i < 1000; i++ {
		result[WeightedRandomIndex(weights)]++
	}
	fmt.Printf("%v\n", result)
}

输出:

[108 189 291 412]

以Go内置的rand.Intn函数作为参照,进行性能对照测试:

package main

import (
	"math/rand"
	"testing"
	"time"
)

var weights = []float32{0.1, 0.2, 0.3, 0.4}
var n int = len(weights)

func BenchmarkWeightedRandomIndex(b *testing.B) {
	rand.Seed(time.Now().Unix())
	for i := 0; i < b.N; i++ {
		WeightedRandomIndex(weights)
	}
}

func BenchmarkRandomIntn(b *testing.B) {
	rand.Seed(time.Now().Unix())
	for i := 0; i < b.N; i++ {
		rand.Intn(n)
	}
}

测试结果:

[root@dev example]# go test -bench=.
goos: linux
goarch: amd64
pkg: example
BenchmarkWeightedRandomIndex-4          34809902                34.1 ns/op
BenchmarkRandomIntn-4                   51488966                23.3 ns/op
PASS
ok      example 3.340s

可以看出:加权随机索引函数比等概率随机索引函数执行效率略慢,但大致相当。

go实现反向代理的四种负载轮询方法(随机、顺序、加权、哈希一致性) 基础知识点 在之前的博文我们实现了反向代理,但是缺乏对应的轮询方法(可以查看我之前的博文) 在反向代理过程中我们需要知道以下的Header头 X-Forwarded-For X-Real-IP $remote_addr X-Forwarded-For: 记录最后连接实际服务器之前的整个代理过程,可能会被伪造 比如以下例子,注意X-Forwarded-For的变化 如果我们在客户端处设置Header的X-Forwarded-For为99.99.99.99,那么就可以实现伪造 X-Real-IP 请求的 阅读详情

相关推荐

Golang实现加权随机

然后,使用当前时间作为随机数生成器的种子,生成一个介于0和总权重之间的随机数。最后,我们遍历选项并根据它们的权重进行比较,返回随机选择的选项值。本文将介绍一种简单而有效的实现方法,并附上相应的源代码。通过定义带有权重的选项和相应的随机选择函数,我们可以在需要使用加权随机数的场景下轻松地生成符合要求的随机结果。在上面的示例中,我们创建了一个包含三个选项的切片,并为每个选项指定了相应的权重。首先,我们需要定义一个结构体来表示带有权重的选项。函数来选择一个随机的选项,并将结果打印在控制台上。

syntax_bug609的博客 288

weightedrand:Go的快速加权随机选择

加权兰德 :balance_scale: Go的快速加权随机选择。 从某种类型的列表中随机选择一个元素,其中每个元素选择的机会并不相等,而是由相对的“权重”(或概率)定义。 这称为加权随机选择。 用法 import ( /* ...snip... */ wr "github.com/mroth/weightedrand" ) func main () { rand . Seed ( time . Now (). UTC (). UnixNano ()) // always seed random! chooser , _ := wr . NewChooser ( wr. Choice { Item : ":cherries:" , Weight : 0 }, wr. Choice { Item : ":lemon:" , Weight : 1 }, wr. C

【信息科学与工程学】【数据科学】数据科学领域 第六篇 算法设计 07 堆、栈、表、矩阵、集合、队列、数组、字符串、树、图、动态规划、结构体、元组的算法01

当前段必须包含所有字符的最后出现位置。1. 字符串分割成最多片段2. 基因序列功能域划分3. 文本段落划分4. 音频声道分离5. 图像色彩分区6. 社交网络社群划分7. 蛋白质结构域8. 音乐乐章分段9. 代码模块划分10. 章节划分特征:一次扫描,贪心确定边界。

weixin_49199313的博客 1174

Go语言数组

【代码】Go语言数组

ZN175623的博客 1320

随机获取数组中的数据

var items = ['f','d','e','s','g','j','k','l','w']; function getRandomElements(arr, count) { var shuffled = arr.slice(0), i = arr.length, min = i - count, temp, index; while (i-- &gt; min) { ...

luodao_的博客 5538

go数组array

go数组array

tiancityycf的专栏 1139

工业级搜索引擎架构实战:PHP+OpenClaw构建多语言混合检索系统

索引擎是现代信息系统的核心组件,其基本原理是通过索引技术将非结构化数据转化为可快速检索的结构。传统的关键词匹配技术(如倒排索引)虽然高效,但在理解语义和上下文方面存在局限。向量检索技术的出现,通过将文本转化为高维向量并计算相似度,实现了语义级别的搜索,极大地提升了搜索的准确性和智能化水平。这一技术对于知识库、电商推荐、内容平台等需要精准匹配用户意图的场景具有重要价值。本文以构建一个支持多语言混合检索的工业级系统为例,深入剖析了如何将传统关键词检索与先进的向量检索相结合,并利用PHP作为业务中枢,整合分布式

weixin_30847865的博客 452

05阶段:NLP自然语言处理基础(1)

one-hot编码的优劣势:劣势:完全割裂了词与词之间的联系,而且在大语料集下,每个向量的长度过大,占据大量内存.正因为one-hot编码明显的劣势,这种编码方式被应用的地方越来越少,取而代之的是接下来我们要学习的稠密向量的表示方法word2vec和word embedding.word2vec介绍 1- 是将文本变成词向量张量的一种方法,是一种无监督(自监督)的训练方法,本质是训练一个模型,将模型的参数矩阵当作所有词汇的词向量表示。基于one-hot的形式进行优化改造 2-

专注前端开发领域,深耕 Python AI 大模型应用,热爱探索 Web 与人工智能的前沿技术。 268

程序员的节日盛宴(1024游戏通关秘籍大公开)

auto-generated

CodeWhim的博客 975

【Python 3.15采样频率终极指南】:掌握高性能数据处理的核心技巧

掌握Python 3.15的采样频率设置,提升数据处理精度与性能。适用于音频处理、传感器数据分析等场景,详解time.sleep()与异步采样控制方法,实现高效精准采集。关键优势在于降低资源消耗并提高响应速度,值得收藏以深入理解实时数据流优化策略。

Algorhythm的博客 737

Python机器学习:从零基础到项目实战

当您翻开此书,您正踏入一场数据与智慧的修行。机器学习,并非冰冷的符码,而是机器模拟人类洞察世界的法门。本书将带您,以Python为舟,泛游于算法之海。我们不只传授“术”,更探求其后的“道”——从数据的生灭流转中观照规律,于模型的迭代演进里体悟得失。愿您合上书卷时,收获的不仅是驾驭数据的技能,更有一双洞悉复杂、化繁为简的“智慧之眼”。现在,让我们一同启程。

YunWisdom 880

【信息科学与工程学】【运营科学】第二篇 C4信息与通信网络运营 (C4) ——数据中心网络运营04

典型值:λ1​∈[−0.02,−0.01], λ2​∈[−0.01,0], η1​,η3​∈[0.1,0.3], η2​,η4​∈[0.05,0.15]参数:δ1​∈[−0.8,−0.3], δ2​∈[−0.5,−0.2], δ3​∈[−0.4,−0.1], δ4​∈[−0.6,−0.2]参数:φ1​∈[0.1,0.3], φ2​∈[−0.2,−0.05], φ3​∈[−0.1,0.1], φ4​∈[−0.3,−0.1]参数:α∈[0.3,0.6], β∈[0.2,0.4], γ∈[0.01,0.03]

weixin_49199313的博客 1076

Python深度学习:从入门到实战

亲爱的读者,欢迎您翻开这本书。我们即将探索的,是深度学习的宇宙——一个由数据、算法与算力构筑的奇妙世界。它既是严谨的科学,也是创造的艺术,更是一条通往未来智慧的修行之路。本书将带您从最基础的数学原理出发,亲手搭建神经网络,驾驭Transformer等前沿模型,最终将智慧转化为现实世界的价值。请放下畏惧,保持好奇。这不仅是一次知识的学习,更是一场思维的远行。来,随我一起,开启这趟非凡的旅程吧。

YunWisdom 126

【信息科学与自动化】计算机科学与自动化——第三百零二篇 大语言模型的训练/推理/微调01

PagedAttention将逻辑连续的KV Cache划分为固定大小的物理块(page),通过页表映射,实现零碎片和高效共享(如beam search)。物理块总数由总显存决定。:d: head维度(64~128),N: 序列长度(可达32K),Br​,Bc​: tile大小(通常64~256),d​为缩放因子。若验证通过则接受,否则回退。4. 进行 P 轮循环:在第 r 轮,每个GPU接收来自前驱的K/V块(或使用本地块),计算局部注意力,更新 mi​,li​,Oi​,然后将自己的K/V块发送给后继。

weixin_49199313的博客 153
上一篇: Go语言:数字类型变量的内存字节数,取值范围以及最大最小值的获取方法
下一篇: Nodejs版本升级导致UTF8中文字符串的md5取值前后不一致的问题
pengpengzhou
博客等级 码龄11年 39粉丝 170原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值