首页
学习
活动
专区
工具
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],

    47430

    扣丁学堂浅谈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个不重复的元素形成新的序列。常用于不重复的随机抽样。返回的是一个新的序列,不会破坏原有序列。

    955100

    真挺简单的!

    下文我将简单介绍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的样本并返回样本的列表。

    51750

    Pandas的apply, 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

    🛰️ 递归思想

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

    803161

    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.9K41

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

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

    8110

    进程信号

    #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

    73620

    常用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日0时0分0秒)之后的秒数对应的日期时间字符串gmtime([seconds]) localtime([seconds])返回新纪元时间之后的秒数对应日期时间的具名元组

    81730

    View 事件分发看了那么多还是不懂?这回让你一次明白!

    不是的,恰恰相反,网上的爆款文章不计其数,待你仔细阅读,却 颇有一种“外地人上了黑车”的感觉 —— 一言不合先上 30 张图表,带你在城市外围饶个上百圈,就是不直奔主题 解释一个现象为什么会存在、造成它存在的缘由为何...顾名思义,递归是一种包含 “递” 流程和 “归” 流程的算法。当我们在找寻目标时,便是处于 “递” 流程,当我们找到目标,打算从目标开始来执行事务时,我们便开启了 “归” 流程。...细节2:明确拦截的作用 网上的内容总是让人误以为,当前层级拦截了,就直接在当前层级消费了。 实际上,当前层级拦截了,只是提前结束了 “递” 流程,并从当前层级步入 “归” 流程而已。...为什么这么设计呢?因为一连串的事件序列,要求在几百微秒内完成。如果每次都完整走一遍方法,那岂不耽误事?...时,被设计为对父容器的 ACTION_DOWN 无效 —— 在父容器 dispatchTouchEvent 时,会首先重置 mGroupFlags。

    65720

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

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

    15810
    领券