如何获得具有固定总和和大小的随机数列表

2024-03-08

如何根据给定大小和期望总和获取随机数列表,完全支持

i hava a code sum-int.ts https://github.com/bluelovers/random/blob/master/src/distributions/sum-int.ts sum-float.ts https://github.com/bluelovers/random/blob/master/src/distributions/sum-float.ts internal/sum-num.ts https://github.com/bluelovers/random/blob/master/src/distributions/internal/sum-num.ts

我想做的事

  1. rN = min ~ max 之间的随机数( float 或 int )
  2. 大小 = [r1, r2, r3, ...rN]. 长度
  3. 总和 = r1 + r2 + r3 + ...rN
  4. 所有 rN 应 >= min,且
  5. 支持(唯一/非唯一)值

but now there has problem

  • 当 max
  • 当 max
  • 代码有逻辑bug,所以我来这里问一下如何用js制作它

好的,就在这里。让我们从整数问题开始。最简单的方法是使用统计分布,它是自然产生的一组数字总和为一个固定值。并且有这样的分布——多项分布 https://en.wikipedia.org/wiki/Multinomial_distribution。它的固定总和等于n,它提供从 0 到n。因为要求采样间隔是任意的,所以首先我们将间隔移动到最小值为0,采样然后将其移回。请注意,采样值可能高于所需的最大值,因此我们必须使用拒绝技术,其中任何高于最大值的样本都将被拒绝,并且将对下一次尝试进行采样。

我们使用 Python/Numpy 的多项式采样。除了拒绝之外,您还可以添加独特性测试。代码,Python 3.7

import numpy as np

def sample_sum_interval(n: int, p, maxv: int):
    while True:
        q = np.random.multinomial(n, p, size=1)[0]
        v = np.where(q > maxv)
        if len(v[0]) == 0: # if len(v) > 0, some values are outside the range, reject
            # test on unique if len(np.unique(q)) == len(q)
            return q
    return None

k = 6
min = -8
max = 13
sum = 13

n    = sum - k*min # redefined sum
maxv = max - min   # redefined max, min would be 0
p = np.full((k), np.float64(1.0)/np.float64(k), dtype=np.float64) # probabilities

q = sample_sum_interval(n, p, maxv) + min # back to original interval
print(q)
print(np.sum(q))
print(np.mean(q))

q = sample_sum_interval(n, p, maxv) + min
print(q)
print(np.sum(q))
print(np.mean(q))

q = sample_sum_interval(n, p, maxv) + min
print(q)
print(np.sum(q))
print(np.mean(q))

Output

[ 5  0 -2  3  3  4]
13
2.1666666666666665
[ 3  3 -1  2  1  5]   
13                    
2.1666666666666665    
[-4  0  0  3 10  4]   
13                    
2.1666666666666665    

为了将其转换为 JavaScript,您需要多项式采样或二项式采样,从二项式很容易转换为多项式。

UPDATE

好的,这是我不添加时的输出min结果,总和为 61 (13+6*8), 范围 [0...21]

[11  7  6  8  9 20]
61
10.166666666666666
[ 5 10 14 13 14  5]
61
10.166666666666666
[ 9 12  7 15  7 11]
61
10.166666666666666

显然,有一个具有多项式采样的 Javascript 库 https://github.com/R-js/libRmath.js,其仿照R, 谢谢你@bluelovers

应该像这样在循环中调用它:

v = rmultinom(1, n, p);

进而v应检查是否在范围 [0...maxv] 内,如果超出则接受或拒绝。

更新二

让我快速地(抱歉,真的没有时间,明天再说)描述一下我将如何为浮动做这件事的想法。在 [0...1] 范围内生成的一组数字也有类似的分布,称为狄利克雷分布 https://en.wikipedia.org/wiki/Dirichlet_distribution,并且它的总和始终为固定值 1。在 Python/Numpy 中,它是https://docs.scipy.org/doc/numpy-1.15.1/reference/ generated/numpy.random.dirichlet.html https://docs.scipy.org/doc/numpy-1.15.1/reference/generated/numpy.random.dirichlet.html.

Suppose I sampled n numbers di from Dirichlet and then map them to [min...max] interval:

xi = min + di*(max-min)

Then I sum them all, using property that all di sums to 1:

总和 = n*min + (max - min) = (n-1)*min + max

If Sum is fixed, then it mean we have to redefine maximum value - lets call it sampling maxs.

So sampling procedure would be as following - sample n [0...1] numbers from Dirichlet, map them to [min...maxs] interval, and check if any of those numbers are below desired max (original, not redefined). If it is, you accept, otherwise reject, like in integer case.

代码如下

import numpy as np

def my_dirichlet(n: int):
    """
    This is equivalent to numpy.random.dirichlet when all alphas are equal to 1
    """
    q = np.random.exponential(scale = np.float64(1.0), size=n)
    norm = 1.0/np.sum(q)
    return norm * q

def sample_sum_interval(n: int, summa: np.float64, minv: np.float64, maxv: np.float64):
    maxs  = summa - np.float64(n-1)*minv # redefine maximum value of the interval is sum is fixed
    alpha = np.full(n, np.float64(1.0), dtype=np.float64)

    while True:
        q = my_dirichlet(n) # q = np.random.dirichlet(alpha)
        q = minv + q*(maxs - minv) # we map it to [minv...maxs]
        v = np.where(q > maxv)     # but we need it in the [minv...maxv], so accept or reject test
        if len(v[0]) == 0: # if len(v) > 0, some values are outside the range, reject, next sample
            return q
    return None

n = 5
min = np.float64(-2.0)
max = np.float64(3.0)
sum = np.float64(1.0)

q = sample_sum_interval(n, sum, min, max)
print(q)
print(np.sum(q))

q = sample_sum_interval(n, sum, min, max)
print(q)
print(np.sum(q))

q = sample_sum_interval(n, sum, min, max)
print(q)
print(np.sum(q))

我已经放置了标准 NumPy Dirichlet 采样以及自定义 Dirichlet 采样。显然,libRmath.js有指数分布采样,但没有狄利克雷,但可以用用户定义的代码和指数替换。请记住,NumPy 使用单个运算符对向量进行运算,循环是隐式的。

Output:

[-0.57390094 -1.80924001  0.47630282  0.80008638  2.10675174]
1.0000000000000013
[-1.12192892  1.18503129  0.97525135  0.69175429 -0.73010801]
0.9999999999999987
[-0.34803521  0.36499743 -1.165332    0.9433809   1.20498888]
0.9999999999999991
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何获得具有固定总和和大小的随机数列表 的相关文章

  • 我需要一个 jQuery Autocomplete 使用 ajax 返回 id 和 name 的示例

    我需要一个示例 说明如何编写 jQuery 自动完成代码来填充product id 同时显示调用ajax 页面 remote php 的product name
  • Mongoose 查找 array.length 大于 0 的所有文档并对数据进行排序

    我正在使用 mongoose 对 MongoDB 执行 CRUD 操作 这就是我的架构的样子 var EmployeeSchema new Schema name String description type String default
  • 未捕获的类型错误:无法读取未定义的属性“prop”

    我有 6 个输入复选框 如果选中的复选框超过 3 个 则最后一个复选框将被取消选中 为了更好地理解 请参阅我之前的question https stackoverflow com questions 35195235 if checkbox
  • 用于传输命名参数和正文的云端点资源属性不起作用

    我正在尝试通过gapi client rpc调用实现对谷歌云端点的调用 如文档中所述 和Google Cloud Endpoints 使用 JS 客户端进行调用 传递参数和 JSON 正文 https stackoverflow com q
  • jQuery 选择器定位具有 id AND class 的元素不起作用

    我有以下事件处理函数 jQuery document on click button submitb function e alert jQuery 包含在 html 文档中 但是 如果我点击 div class submitb Go di
  • IE8 中空 div 层的 z-index 问题

    我在 IE8 中遇到 z index 问题 其他尚未测试 以下 JS 创建一些 html css document write img src border 0 document write div style background col
  • 如何避免 TypeScript 中出现虚假的“未使用参数”警告

    我遇到过很多次这种情况 最后决定弄清楚正确的方法是什么 如果我有一个声明方法的抽象父类 然后一些具体子类在其实现中实现真正的逻辑 并且显然使用方法参数 但某些子类不需要在该方法中执行任何操作 因此不要使用方法参数 那些不必执行任何操作的方法
  • 在 JQuery ui 自动完成中显示图像

    我有一个带有 JQuery ui 自动完成功能的脚本 可以完美运行 有一个显示用户名字和姓氏的搜索过程 但在我的数据库中 还有用户的图片 我想将其显示在带有名字和姓氏的建议中 数据库中pic包含图片url 剧本 function searc
  • 动态更改 vuejs 2 中的选择输入选项

    如何动态更改选择下拉 v model 中的选项 我有 2 个选择输入 其中一个应该根据其他输入进行更改 例如 如果我选择 水果 则选择显示水果 如果我选择 蔬菜 则选择显示蔬菜 我不使用Vuejs 但查看文档后 var TypesArr F
  • 在移动网站中处理 iPhone 事件(如向左滑动)

    iPhone 浏览器是否有可以使用 Javascript 挂钩的特殊事件 例如 如果用户向左滑动 我想执行某个操作 如果有类似的活动 很高兴看到所有这些活动的参考 理想情况下 有一天所有触摸屏移动浏览器都会有一个标准 您可以访问多点触控事件
  • 如何更改元素的 CSS 类并在单击时删除所有其他类

    我如何处理 AngularJS 2 中的一种情况 即单击一个元素需要更改其自己的样式 并且如果其他元素具有该样式 则需要将其删除 最好在一个函数中 如同Angular js 如何在单击时更改元素 css 类并删除所有其他元素 https s
  • iPhone 点击时使 div 变暗

    当您的 div 附加了点击处理程序时 当点击该 div 时 iPhone 会使该 div 变暗 作为点击指示器 示例 在移动 Safari 上查看http jsbin com awejo3 4 http jsbin com awejo3 4
  • JavaScript 中的最短路径

    几周来我一直在寻找一种在 JavaScript 中计算最短路径的方法 我一直在玩书数据结构和算法作者 格罗纳 Groner 名字恰如其分 https github com loiane javascript datastructs algo
  • keystonejs 模型中的动态类型选择

    我想在 adminUI 中使用一个组合框 其中包含来自 Web 服务的字段 我正在考虑使用预 查找 挂钩获取数据 然后覆盖模式中 受众 属性的选项属性 Schema Compliance add title type Types Text
  • 使用 javascript/jquery 从数据库格式化日期的正确方法

    我正在调用包含日期时间数据类型的数据库 日期看起来像这样 2005 05 23 16 06 00 000 当用户从列表中选择某个项目时 我想在表格中显示它 我调用我的控制器操作并返回所有时间的 Json 并将它们放入表中 问题是日期完全错误
  • 这个 JQuery 指令做什么 $(function(){...}) [重复]

    这个问题在这里已经有答案了 我最近一直在研究JQuery 尽管我知道一些东西 但书上有这样一句话我根本无法理解 function current entry 1 有谁知道这条线是如何工作的以及它的作用是什么 它类似于 JQuery 函数中的
  • JsGrid 将嵌套对象加载到表中

    我正在 Django 中开发一个 Web 项目并使用 jsGrid 我遇到了问题并且找不到解决方案 我有一个嵌套的 JSON 数据 它是通过组合多个数据库表记录创建的 这是我的 JSON count 3 results personnel
  • 错误:模块“html”不提供视图引擎(Express)

    我正在尝试设置一个简单的路由应用程序 但在渲染页面时不断遇到错误 Error Module html does not provide a view engine 奇怪的是我已经在 app js 文件中指定了视图引擎 但仍然收到错误 app
  • Javascript/jQuery 外部高度()

    Does idOfLememt outerHeight 对所有浏览器产生相同的结果 IE7 有什么不同吗 只要去http api jquery com outerHeight http api jquery com outerHeight
  • 我如何用 javascript/jquery 进行两指拖动?

    我正在尝试创建当有两个手指放在 div 上时拖动 div 的功能 我已将 div 绑定到 touchstart 和 touchmove 事件 我只是不确定如何编写这些函数 就像是if event originalEvent targetTo

随机推荐

  • 构建数据库项目时出现“不正确的 SET 选项”错误

    我们正在使用 Visual Studio 和数据库项目来生成我们的数据库 我刚刚做了一些数据库更改 包括添加一个名为Correspondence 将这些更改导入到数据库项目中 并尝试部署 重建 数据库 当我这样做时 我收到以下错误 正在创建
  • ImportError:没有名为“matplotlib.pyplot”的模块; matplotlib 不是一个包

    我正在尝试使用 matplotlib 对心电图信号进行实时分析 但问题甚至在此之前就开始了 我使用 PyCharm IDE 目前使用 Python 3 3 我的操作系统是 Windows 8 1 对于 Matplotlib 我从这里下载了
  • 在范围“no autodie”之后,程序在“*STDOUT”处终止

    这个节目 use warnings use strict use feature qw say use autodie all good when this is uncommented no autodie open my OLDSTD
  • 根据.config剥离Linux内核源代码

    是否有任何有效的方法 也许通过滥用 gcc 预处理器 来获取一组剥离的内核源代码 其中根据 config 不需要的所有代码都被省略 好吧 我们采取了一些解决方案 首先 可以通过以下方式获取所使用的编译器命令 make KBUILD VERB
  • 是否可以/推荐发送包含 Javascript 的 HTML 电子邮件? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Android Studio 中的 NDK 集成

    今天我将android studio更新到1 3 并在local properties中输入NDK android ndk r10e NDK版本 路径 ndk dir C AndroidNDK android ndk r10e androi
  • 在 AngularJs 中制作工厂模块的正确方法

    我有一个像这样的控制器功能 scope localTimezone function userTimezone datetime return data 使其成为工厂模块的正确方法是什么 我尝试了以下操作 但出现错误 angular mod
  • 已完成百分比的流

    我需要使用类似的方法将 base64 格式的文件流式传输到 http 端点request https github com mikeal request or 超级代理人 https github com visionmedia super
  • 如何将 UISearchController 搜索栏设置为不是 tableHeaderView 或 navigationItem.titleview 的视图?

    我试图在表格滚动时保持搜索栏可见 目前 我将其作为表视图中的标题 并且它按应有的方式工作 但是当然 当您沿着表格向下滚动时 搜索栏会滚动到屏幕之外 我想我可以简单地修改这个代码示例来做到这一点 如何在 iOS 8 中使用 UISearchC
  • Keycloak - 如何检查用户名和电子邮件是否存在

    我们希望以编程方式创建 Keycloak 用户 并检查用户名和 或电子邮件地址是否已存在于 Keycloak 中 我们正在使用的版本4 4 0 FINAL 当我们使用 Keycloak 管理客户端以编程方式创建用户时 如果用户名或电子邮件地
  • Laravel 路线带我去别的地方

    我正在尝试通过 Laravel 和 vue js 创建 CRUD 应用程序 但这里总是存在问题 当我运行该应用程序时 它会转到仪表板并且不会出现 CRUD 操作 以下是 Routes web app 代码
  • 基于 int 创建多个编号变量

    我将如何创建多个NSDictionary使用数组计数的变量 这基本上是我想到的 但我不确定如何使用 Objective C 语法来实现它 doesntContainAnother is an NSArray 我希望字典的名称使用当前值loo
  • CMD脚本:如何关闭CMD

    我创建了一个小命令 可以让我启动 Internet Explorer 但是 我希望关闭启动 IE 时显示的小命令提示符 我怎样才能做到这一点 这是我当前的代码 ProgramFiles Internet Explorer iexplore
  • 未知协议:c(JDOM 和 SAXBuilder)

    我正在使用 JDOM 和 SAXBuilder 来解析 XML 文件 但我遇到了一个抛出此错误的文件问题 java net MalformedURLException unknown protocol c at java net URL
  • Shell 命令适用于命令行,但不适用于 PHP exec

    我有一个命令 当直接在命令行上运行时 它可以按预期工作 它运行超过 30 秒并且没有抛出任何错误 当通过 PHP 函数 exec 包含在由 cron 调用的脚本中 通过 PHP 脚本调用相同的命令时 它会抛出以下错误 最长执行时间为 30
  • Windows 下以 cygwin 和 Github 结尾的行

    我希望能够使用 Windows 应用程序的 Github 以及使用 Cygwin 在 Windows 上 的命令行中的 git 来处理我的 git 项目 但当我从一种切换到另一种时 我不断遇到行尾问题 如果使用命令行工具存储库没有更改 它将
  • 如何模拟从不同模块导入的方法中导入的函数[重复]

    这个问题在这里已经有答案了 我有以下功能要测试 my package db engine db functions py from utils import execute cmd from my package db engine db
  • 使用jquery获取facebox div内元素的值

    我的页面上有两个 div 标签 如下所示 当我引用 itemName 元素的值时 使用 itemName val 我在两个 div 中都有 我总是得到第一个 div 中元素的值 即 空白 有没有办法使用 jquery 获取第二个 div 中
  • 在所有地址上运行我自己的用户脚本有风险吗?

    Tampermonkey 对于大多数浏览器 和 Greasemonkey 对于 Firefox 都支持 match and include指令 当我开始阅读它们之间的区别时 结果发现 match有点严格 用户脚本不会在某些地址上启动 这可能
  • 如何获得具有固定总和和大小的随机数列表

    如何根据给定大小和期望总和获取随机数列表 完全支持 i hava a code sum int ts https github com bluelovers random blob master src distributions sum