【问题标题】:Random Number Generation with constraints in any programming language任何编程语言中带有约束的随机数生成
【发布时间】:2014-04-16 00:14:37
【问题描述】:

我想生成 150 个随机数,其值为正整数 (1,2,3,4,5.....),这样所有随机数的总和为 270 并且

Prob[1] = 0.405
Prob[2] = 0.345
Prob[3] = 0.125
Prob[4] = 0.092
Prob[>=5] = 0.033

基本上,所有随机数的总和是固定的,概率是固定的,随机数应该取大于0的值。

有谁知道如何用 python/MATLAB/C 或任何其他编程语言生成它。

【问题讨论】:

  • 您有矛盾的要求。如果 150 个数字有一个固定的和,那么其中至少有一个不是独立随机的。您可以根据您的分布绘制 149,并根据当前和目标总和计算最后一个。行得通吗?
  • 是的,你是对的。那样就好了……至少其中一个不会是随机的。
  • 这些概率有多灵活?例如 0.405*150 = 60.75 那么结果中必须有 61 个吗?更糟糕的是 0.405*150*1 + 0.345*150*2 + 0.125*150*3 + 0.092*150*4 = 275.7 这大于 270 的最大总和...
  • 是的,我知道,这就是约束使问题变得困难的原因。它是一种优化问题,其中一个约束影响另一个约束。我和你的想法一样,但我认为,如果要满足 sum,总会有一些错误。

标签: python matlab math random


【解决方案1】:

修改表格,使其具有累积概率和:

[ 0.405, 0.750, 0.875, 0.967, 1.0 ] 

从 (0.0, 1.0) 绘制一个均匀随机数。在表格中搜索大于抽奖数量的最小条目;指数就是你的价值。加到总数中。重复 149 次。

从 270 中减去总数,得到最后一个。

【讨论】:

  • 虽然该解决方案可行,但前提是约束实际上是合理的,但它永远不会产生包含大于 5 的数字的解决方案,这在问题中是明确允许的。
  • 我已经这样做了,我在每次迭代中不断计算总和,同时根据您告诉的方法分配一个随机数 {1,2,3,4,5,....}。总和有时在 143 的位置跨越 270,有时在 141 的位置。所以,现在没有什么可以分配了,这意味着我需要从早期的值中减去一些东西,以便在 7 个或 9 个位置的左侧分配至少 1 个。
  • 想一想,最后一个数字可能大于五——但只有最后一个数字。然而,更大的问题是问题中指定概率分布的 150 个数字加起来超过 270...
  • 数字(根据给定分布分配时)加起来为 270 直到 150 之前的某个位置。在那之后,有些事情需要做!!!我不知道现在该怎么办。
  • @user3388706 它们的总和不太可能达到 270。您可以运行多个模拟并保留一个总和为 270 的模拟。这可以接受吗?如果加起来,采样的概率分布将与期望的完全不同。
【解决方案2】:

要使其加起来达到 270,可能需要从指定分布中重复生成 150 个样本的集合,直到样本加起来达到 270。但是,在这种情况下,值的分布不会非常接近所需的分布。

在 MATLAB 中,最简单的方法是使用信号处理工具箱的一部分 randsample。例如,

randsample(1:5, 150, true, [0.405 0.345 0.125 0.092 0.033])

运行它直到输出总和为 270:

rsum = 0;
while rsum~=270,
    rs = randsample(1:5, 150, true, [0.405 0.345 0.125 0.092 0.033]);
    rsum = sum(rs);
end

对于 >5 的值,也许您可​​以将样本 ==5 替换为从 [5,Inf) 上的均匀分布中获取的新数字,或者最多 intmax

fives = rs==5;
rs(fives) = randi(intmax-5+1,nnz(fives)+100,1)+5-1

如果你没有randsample,可以如下制作样例,

N = 150;
vals = 1:5;
p = [0.405 0.345 0.125 0.092 0.033];

cdf = [0 cumsum(p(:).'/sum(p))]; cdf(end)=1;
[~, isamps] = histc(rand(N,1),cdf);
rs = vals(isamps);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-24
    • 2014-04-18
    • 1970-01-01
    • 2012-03-18
    • 2016-08-25
    • 1970-01-01
    • 1970-01-01
    • 2010-09-10
    相关资源
    最近更新 更多