首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么在传递递减值的列表"cum_weights“时,"random.choices”总是返回相同的元素?

在使用 random.choices 函数时,如果传递的权重列表 cum_weights 是递减的,可能会导致函数总是返回相同的元素。这是因为 random.choices 函数在计算累积权重时,依赖于权重的相对大小,而不是绝对值。

原因分析

  1. 累积权重计算random.choices 函数通过累积权重来决定选择哪个元素。如果权重列表是递减的,累积权重的计算可能会导致某些元素的累积权重始终大于其他元素,从而使得这些元素被选中的概率更高。
  2. 浮点数精度问题: 在计算累积权重时,可能会涉及到浮点数的运算。由于浮点数精度的限制,递减的权重列表可能会导致累积权重的计算结果出现微小的差异,这些差异在多次运行中可能会被放大,导致选择结果不一致。

解决方法

为了避免这个问题,可以确保权重列表是递增的,或者在传递权重列表之前对其进行预处理。

方法一:确保权重列表递增

代码语言:txt
复制
import random

weights = [0.1, 0.3, 0.2, 0.4]
cum_weights = []
cumulative_sum = 0
for weight in weights:
    cumulative_sum += weight
    cum_weights.append(cumulative_sum)

# 确保累积权重列表是递增的
assert all(cum_weights[i] <= cum_weights[i+1] for i in range(len(cum_weights)-1))

selected_element = random.choices(range(len(weights)), cum_weights=cum_weights)[0]
print(selected_element)

方法二:预处理权重列表

代码语言:txt
复制
import random

weights = [0.1, 0.3, 0.2, 0.4]
cum_weights = [sum(weights[:i+1]) for i in range(len(weights))]

# 确保累积权重列表是递增的
assert all(cum_weights[i] <= cum_weights[i+1] for i in range(len(cum_weights)-1))

selected_element = random.choices(range(len(weights)), cum_weights=cum_weights)[0]
print(selected_element)

参考链接

通过上述方法,可以确保 random.choices 函数在传递递减值的权重列表时,能够正确地选择元素,避免总是返回相同的元素。

相关搜索:在循环中初始化结构时,为什么地址总是相同的?为什么在fortran中使用函数和contains时总是得到相同的结果为什么在获取列表中的所有其他元素时,我会获得额外的元素?当多个元素具有相同的名称时,无法在Ajax成功返回时将单击的元素作为目标为什么我的字典中的值在每个元素的列表中以列表的形式返回?Dart/Flutter:列表中的元素字符串在作为参数传递时变为空(为什么??)Vue JS根据传递的属性数据在挂载时获取数据总是返回false在使用select2的视图中将值传递给列表时返回null的列表当尝试传递两个相同的整数数组时,为什么contains方法返回false在xamarin.forms中点击包含多个本地通知的推送通知时,总是返回相同的id为什么当我随机选择一个要放入列表中的数字时,它总是选择相同的起始数字?为什么在Julia中,负1 (-1)被提升到一个偶数的幂,返回的结果总是相同的?为什么我的模型在Google Colab上训练时总是在Keras Tensorflow中返回0 val loss?为什么在redux中使用不可变的数据结构时,选择器总是返回不可变的?为什么std:string在比较相同文本的子字符串时不返回0?当我在表单元素中传递表单时,为什么onSubmit不提交表单。但当我在React中的button元素中传递它时,它确实提交了Flutter with filter search页面在返回到页面时不断添加来自查询的相同列表视图为什么在之前初始化的html元素变量上使用JQuery时,它会返回undefined?当我在条件语句中使用相同的值时,为什么我的插入排序算法返回不同的值?为什么我在web抓取时得到的是一个空列表而不是一个包含元素的列表
相关搜索:
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • random和np.random函数详解

    () 针对序列进行随机取数一个函数 random.choices(sequence, weights=None, cum_weights=None, k=1) sequence:待抽取序列;list...,tuple,字符串等 weights:列表是可以权衡每个值可能性,可选 cum_weights列表是可以权衡每个值可能性,只有这一次累积可能性 k:可选。...1、针对列表随机取数 # 1、列表 names = ["Mike","Tom","Peter","Jimmy"] random.choices(names) ['Tom'] random.choices...' random.choice(address) # choice 'a' 要注意random.choices返回列表random.choices(address) # choices:返回列表..., 5, 2, 9, 4]) 还可以指定每个元素被抽取概率,p中所有元素和为1,且个数必须为待抽取序列中个数相同: np.random.choice([1,2,3,4,5],

    41130

    软件测试|Python random模块,超乎想象强大

    N当 a <= b,a <= N <= b当 b < a , b <= N <= a使用示例import randomfor i in range(5): print(random.uniform...random.choice()语法如下:random.choice(seq)语法说明:从非空序列 seq 返回一个随机元素如果 seq 为空,会抛出 IndexError示例如下:import stringprint...()语法如下:random.choices(population, weights=None, *, cum_weights=None, k=1) 参数说明:populaiton:序列weights:普通权重...cum_weights:累加权重k:选择次数注:weights 和 cum_weights 不能同时传,只能选择一个来传示例如下:import randoma = [1,2,3,4,5]print(random.choices...0, 1], k=5))# 序列有多长,weights 对应序列就得多长,每个位置都是一一对应# 像这里,5 权重是 1,其他是 0 ,所以每次都取 5,因为它权重最高,其他元素没有权重####

    20010

    扣丁学堂浅谈Python视频教程之random模块详解

    Python这个库底层使用通用算法,经过长久考验,可靠性没得说,但绝对不能用于密码相关功能。...random.randint(a, b) 返回一个a 三、针对序列类结构方法 random.choice(seq) 从非空序列seq中随机选取一个元素。...random.choices(population, weights=None, *, cum_weights=None, k=1) 3.6版本新增。从population集群中随机抽取K个元素。...weights是相对权重列表cum_weights是累计权重,两个参数不能同时存在。 random.shuffle(x[, random]) 随机打乱序列x内元素排列顺序。...random.sample(population, k) 从population样本或集合中随机抽取K个不重复元素形成新序列。常用于不重复随机抽样。返回是一个新序列,不会破坏原有序列。

    944100

    真挺简单

    下文我将简单介绍random模块中几个函数,有的可以生成随机浮点数、整数、字符串,有的可以帮你随机选择列表序列中一个元素,打乱一组数据等。...random() random()函数区间 [0.0, 1.0) 内均匀生成随机浮点数,是模块中几乎所有函数基础。 import random random.random() ?...choice() 实际是两个函数:choice()、choices() random.choice(seq) 从非空序列 seq 返回一个随机元素。...如果 seq 为空,则引发 IndexError random.choices(population, weights=None, *, cum_weights=None, k=1) 返回从 population...这种办法随机抽取元素也是可以重复,如果想去重可以参考前文。 sample() sample(n) 是指从序列中选择n个随机且独立元素

    2.1K20

    python测试测开-面试准备第1天

    点评:送人头题目,因为Python标准库中常用模块应该是Python开发者都比较熟悉内容,这个问题回如果答不上来,整个面试基本也就砸锅了。...random.shuffle(x)函数可以实现对序列x原地随机乱序。 random.choice(seq)函数可以从非空序列中取出一个随机元素。...random.choices(population, weights=None, *, cum_weights=None, k=1) 函数可以从总体中随机抽取(有放回抽样)出容量为k样本并返回样本列表...,可以通过参数指定个体权重,如果没有指定权重,个体被选中概率均等。...random.sample(population, k) 函数可以从总体中随机抽取(无放回抽样)出容量为k样本并返回样本列表

    50850

    基于Python中random.sample()替代方案

    python中random.sample()方法可以随机地从指定列表中提取出N个不同元素,但在实践中发现,当N值比较大时候,该方法执行速度很慢,如: numpy random模块中choice方法可以有效提升随机提取效率...补充知识:Python: random模块随即取样函数:choice(),choices(),sample() choice(seq): 从seq序列中(可以是列表,元组,字符串)随机取一个元素返回...choices(population, weights=None, *, cum_weights=None, k=1): 从population中进行K次随机选取,每次选取一个元素(注意会出现同一个元素多次被选中情况...),weights是相对权重值,population中有几个元素就要有相对应weights值,cum_weights是累加权重值,例如,相对权重〔10, 5, 30,5〕相当于累积权重〔10, 15,...在内部,进行选择之前,相对权重被转换为累积权重,因此提供累积权重节省了工作。返回一个列表。 sample(population, k)从population中取样,一次取k个,返回一个k长列表

    1.4K20

    Pandasapply, map, transform介绍和性能测试

    transform  DataFrame.transform(func, axis=0, *args, **kwargs) -> DataFrame 前两个函数工作元素级别,而transform...Transform必须返回一个与它所应用轴长度相同数据框架。 也就是说即使transform与返回聚合值groupby操作一起使用,它会将这些聚合值赋给每个元素。...DataFrame.agg(func=None, axis=0, *args, **kwargs) -> scalar | pd.Series | pd.DataFrame agg函数更容易理解,因为它只是返回传递给它数据聚合...所以无论自定义聚合器是如何实现,结果都将是传递给它每一列单个值。 来看看一个简单聚合——计算每个组得分列上平均值。  ...df.groupby("subject")["score"].agg(mean_score="mean").round(2) 多个聚合器也可以作为列表传递

    2K30

    🛰️ 递归思想

    递归理解:程序中可以调用函数来完成任务,为了完成相同任务可以调用同一个函数。如果在函数中调用函数本身,那么改函数就被称为递归函数。...图片递归函数分为两类:过程中解决问题在归来过程中解决问题举例说明:图片去过程中解决问题:前面人手中子弹总数加上自己手上,告诉下一个人,最后把子弹总数回传给上一个人。...图片归来过程中解决问题:把消息传递下去,让最后的人把手中子弹数告诉前一个人,前一个人加上后一个人告知数量,继续向前传递。图片递归函数参数每次调用时应该是不同!...----循环和递归:递归函数调用有时间和空间开销,而且递归次数受到堆栈大小限制。循环没有函数调用和返回参数传递返回额外开销,更快。如何在递归和循环之间选择?...当很难简历一个循环方法,递归可能是一个很好选择(某些情况下,递归方法总是显而易见,而循环方法却是难以实现)某些数据结构(树)本身就是递归,则使用递归也是最好方法了。

    802161

    Python生成随机数22种方法,random函数太强了~

    从集群中随机选取k次数据,返回一个列表,可以设置权重。一共有4个参数population:集群,必填。weights:相对权重。cum_weights:累加权重,不常用。不能和weights共用。...代码示例str = ["程", "序", "员", "晚", "枫"]res = random.choices(str, weights=[0, 0, 1, 0, 0], k=5)"""因为给【员】这个字...代码示例int = random.randrange(3, 9)"""int = 5"""8. random.sample从集合中选取k个元素返回一个列表,集群可以是list、tuple、str、set...,注意:这个方法没有返回值,它直接改变是原集合顺序。...于是决定从这一篇开始,我决定带着当时加入Python,喂马劈柴面朝大海浪漫情怀,去认真的深入整理分享Python常用知识点。希

    1.8K41

    C++11 lambda 表达式详解(带例题)

    前言: lambda表达式出现主要是为了解决排序问题。 但我们C++98中已经有了std::sort函数,为什么还要lambda表达式呢?...,该列表总是出现在lambda函数开始位置,编译器根据[]来判断接下来代码是否为lambda函数,捕捉列表能够捕捉上下文中变量供lambda函数使用。...看情况书写 mutable:默认情况下,lambda函数总是一个const函数,mutable可以取消其常量性。使用该修饰符,参数列表不可省略(即使参数为空)。...不写 ->returntype:返回值类型。用追踪返回类型形式声明函数返回值类型,没有返回此部分可省略。返回值类型明确情况下,也可省略,由编译器对返回类型进行推导。...捕捉列表不允许变量重复传递,否则就会导致编译错误。 比如:[=, a]:=已经以值传递方式捕捉了所有变量,捕捉a重复 d. 块作用域以外lambda函数捕捉列表必须为空。 e.

    6410

    进程信号

    #include void abort(void); 就像exit函数一样,abort函数总是会成功,所以没有返回值。...被阻塞信号产生将保持未决状态,直到进程解除对此信号阻塞,才执行动作 注意,阻塞和忽略是不同,只要信号被阻塞就不会达,而忽略是达之后可选一种处理动作。...信号产生,内核进程控制块中设置该信号未决标志,直到信号达才清除该标志。在上图例子中,SIGHUP信号未阻塞也未产生过,当它执行默认处理动作。...内核如何实现信号捕捉 如果信号处理动作是用户自定义函数,信号就调用这个函数,这称为捕捉信号。...中断处理完毕后要返回用户态main函数之前检查到有信号SIGQUIT达。

    1.3K20

    如何更好地理解递归算法?Python实例详解

    ❞ ""是传递意思,"归"是归还意思,先把一个方法一层层传递下去,然后传递到最后一层再把结果归还回来。...大家看上图,递归函数会一层层往下调用,最终到n=1时候,往上返回结果。...这就是递归全过程,如果我们给递归下一个准确定义,可以概括为以下3点: 1、至少有一个明确递归结束条件; 2、给出递归终止处理办法; 3、每次进入更深一层递归,问题规模(计算量)相比上次递归都应有所减少...n = n*factorial(n-1) # 去 return n # 归来 除了常见阶乘案例,还有斐波那契数列,也是递归经典用法。...max表示有序列表尾部索引 d表示有序列表 n表示需要寻找元素 ''' mid = (min+max)//2 if mid==0: return

    71920

    常用Python标准库对象速查表(1)

    (population, weights=None, *, cum_weights=None, k=1)从非空序列中随机选择k个元素(允许重复),返回包含这些元素列表randint(a, b)区间[...[0, 1)上随机返回一个实数sample(population, k)从序列或集合中随机选择k个不重复元素返回包含这些元素列表shuffle(x, random=None)原地打乱列表x中元素顺序...statisticsmean(data)返回数据算术平均值median(data)返回数据中值(排序后中间位置上数值)mode(data)返回数据中出现次数最多一个元素,如果有出现次数并列最多不同元素则报错...pstdev(data, mu=None)计算数据总体标准差,也就是总体方差平方根collectionsCounter用来统计元素出现次数类,返回类似于字典对象,其中包含每个元素及其出现次数OrderedDict...timectime(seconds)返回新纪元时间(1970年1月1日00分0秒)之后秒数对应日期时间字符串gmtime([seconds]) localtime([seconds])返回新纪元时间之后秒数对应日期时间具名元组

    81530

    【Linux】信号知识三把斧——信号产生、保存和处理

    1.6.为什么每一个进程都可以系统调用? 写拷贝时候拷贝全部都是用户空间,不会拷贝内核空间 每一个进程都有自己地址空间,多个进程就会有多个地址空间,但是内核空间只有一份。...Ctrl+\会生成core文件,这个文件包含了进程退出内存映像,可以用于调试。...exit函数一样,abort函数总是会成功,所以没有返回值。...被阻塞信号产生将保持未决状态,直到进程解除对此信号阻塞,才执行动作. 注意,阻塞和忽略是不同,只要信号被阻塞就不会达,而忽略是达之后可选一种处理动作。...为什么默认关闭核心转储功能?防止未知core dump 一直进行,导致服务器磁盘被打满,所以默认core是关闭。 如何打开Linuxcore功能呢?

    12610
    领券