python - 使用规则随机生成列表元素

标签 python algorithm

令列表ln个元素组成,其中

  1. 每个元素应为 0 或小于或等于 r 的正整数,并且
  2. 列表的总和应该等于m

例子:

Given n = 5, r = 4, m = 10

l = [4, 3, 2, 0, 1]

很容易满足规则(1),但我想知道是否有什么好主意/算法来满足这两个规则?

最佳答案

这是一个简单的暴力解决方案。基本上,您想要生成样本,其中随机整数小于 r 的可能性相同。不符合标准(总和为 m)的样本将被拒绝。

import numpy as np

def rand_with_rules(n, r, m):
    if n*(r-1) < m:
        raise ValueError
    while True:
        l = np.random.randint(0, r, size=(n))
        if l.sum() == m:
            return l

请注意,拒绝样本必然会使您的“随机”数字产生偏差。由于您的限制,您不能拥有一组纯粹的随机数,并且某些意愿往往会过多或不足。

例如,n, r, m = 2, 3, 4 的情况。唯一符合这个条件的系列是 (2, 2),所以抽到 2 的可能性是 100%,其他抽到 0%值(value)观。

本质上,这个解决方案表明您事先不知道哪些整数最有可能。然而,由于约束,您对数字的后验知识几乎永远不会真正统一。

对于给定此约束的整数分布,可能有一个聪明的解析解,您可以使用它来生成样本。但我不知道它是什么!

关于python - 使用规则随机生成列表元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31737663/

相关文章:

c# - 恶霸算法

python - 如何在python中获取没有名称的参数

algorithm - IDAT PNG block ,第一个字节意外,我哪里错了?

python - 如何在 Pipfile 中指定操作系统特定的 wheel 文件

python datetime.strftime 不支持日文?

python - 计算循环空间复杂度的基础是什么?

algorithm - 代码段的时间复杂度

algorithm - 给定 RNG 算法和一系列数字,是否有可能确定产生该系列的种子?

python - 将 xml 扁平化为 pandas 数据框,深度嵌套

python - 用于安装 Tensorflow 的虚拟环境 : Why Do I need it for Whiich Purpose?