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

时间:2021-07-21 19:53:04

标签: python random

我不明白 from django.urls.conf import path from . import views app_name = 'main' urlpatterns = [ path('', views.hello, name="hello"), ] cum_weights 参数。

我读到它是:

前一个元素的权重+自身权重 [10, 5, 1] → [10, 15, 16]

据我了解,random.choices 的概率是 16,是最高的。那么为什么 "cherry" 的重复性会更高?

"apple"

输出:

import random

mylist = ["apple", "banana", "cherry"]
print(random.choices(mylist, cum_weights=[10, 5, 1], k=9))

4 个答案:

答案 0 :(得分:0)

当您有相对权重时,累积权重看起来像这些值的总和:

您的 cum_weights 应该是:[10, 15, 16]

mylist = ["apple", "banana", "cherry"]
print(random.choices(mylist, cum_weights=[10, 15, 16], k=14))
['apple', 'banana', 'cherry', 'banana', 'apple', 'banana', 'apple', 'apple', 'banana', 'banana', 'apple', 'banana', 'banana', 'banana']

答案 1 :(得分:0)

def read_path(): files = [] suffixes = ('_SUCCESS', 'referen/') files_path = fs.listdir(f"s3://{path}") if files_path is not None: for num, file in enumerate(files_path, start=1): if not file['Key'].endswith(suffixes): files.append(file['Key']) return files def from_containers(container, path): containers = [] for num, file in enumerate(read_path(container, path), start=1): containers.append(client.V1Container(name=f'hcm1-{num}', image='image-python', command=['python3', 'model.py'], env=[client.V1EnvVar(name='model', value='hcm1'), client.V1EnvVar(name='referen', value=f"s3://{file}")])) template = client.V1PodTemplateSpec(metadata=client.V1ObjectMeta(name="hcm1"), spec=client.V1PodSpec(restart_policy="OnFailure", containers=from_containers(containers, path), image_pull_secrets=[client.V1LocalObjectReference(name="secret")])) spec = client.V1JobSpec(template=template, backoff_limit=20) job = client.V1Job(api_version="batch/v1", kind="Job", metadata=client.V1ObjectMeta(name="hcm1"), spec=spec) api_response = batch_v1.create_namespaced_job(body=job, namespace="default") print("Job created. status='%s'" % str(api_response.status)) 和说weights=[10,5,1]是一样的。 cum_weights=[10,15,16] 值必须按升序排列才能有意义。你提供的东西会让事情变得混乱。 cum_weights 将使用最大值作为其随机范围,因此在您的情况下,它将选择 0 到 9 之间的数字,并且由于您的前 10 个值是“apple”,因此它始终会选择“apple” ”。

答案 2 :(得分:0)

您混淆了相对权重和累积权重。 随机选择中的 cum_weights=[10, 5, 1] 参数是累积权重本身,不会进一步累积。

答案 3 :(得分:0)

cum_weights 参数不会进一步累积。你可以在这里查看函数的实现https://github.com/python/cpython/blob/3.9/Lib/random.py#L473 看看这行https://github.com/python/cpython/blob/3.9/Lib/random.py#L505 生成输出的位置。在 bisect 方法中,它尝试确定索引 random()*total 在数组 cum_weights 中的位置。在您的情况下,cum_weights[10, 5, 1]。并查看这一行 https://github.com/python/cpython/blob/3.9/Lib/random.py#L500 以了解如何计算 totaltotal = cum_weights[-1] +0.0 这意味着您的 total 始终为 1.0,因为 cum_weights 的最后一个值为 1。因此,您始终获得第一个索引,即总体中的 0。所以你的输出将包含所有“苹果”。即使您运行该算法一千次,您当前的实现也只会在我们的输出列表中获得 apple

相关问题