【问题标题】:Calculate amount of combinations with conditions计算有条件的组合数量
【发布时间】:2017-12-01 14:04:58
【问题描述】:

我想计算一定数量的数字可能有多少种不同的变化。元素的数量是可变的。

示例: 我有 5 个元素,每个元素可以在 0 到 8 之间变化。只有第一个元素定义得更多,只能在 1 到 8 之间变化。到目前为止,我会说我有 8*9^4 的可能性。但我还有一些条件。一旦其中一个元素变为零,下一个元素也应自动为零。

例如:

6 5 4 7 8 没问题

6 3 6 8 0 没问题

3 6 7 0 5 是不可能的,会变成 3 6 7 0 0

有人能告诉我如何计算这种情况下的组合数量,而且一般来说,因为我也希望能够计算 4 个或 8 个或 9 个等元素的组合数量。稍后我想在 VBA 中计算这个数字,以便能够给用户一个预测我的计算需要多长时间。

【问题讨论】:

  • 这是一个纯数学问题,不是程序问题!你也知道如何区分第一个值;下一个你会怎么做?
  • 是的,但这对除第一个职位外的任何职位都有效。这意味着 3 0 6 5 4 也无效。我认为第一个元素对于计算并不重要,因为它无论如何都不能为零。所以如果我做 8*9^4 - 9^3 -9^2 -9 我应该有可能。但这似乎太过分了。我在 VBA 中用 5 个元素对案例进行了编码并实现了一个计数器,我得到 37448。
  • 你是说你已经有一个VBA程序来计算数字,还是你需要帮助来制作这样一个程序?或者您是说您现在可以在 VBA 中进行蛮力操作,并且您想要一个更有效的例程?还是别的什么?
  • 嗨,Rory,我有一个 VBA 程序来计算上面提到的数字的值。但我只能在 VBA 中进行蛮力,我想有一个更有效的方法。目前有 5 个元素,我有大约 37448 次迭代,这需要我的笔记本电脑 0.4 秒。当我将数量增加到 8 个元素时,它已经花费了将近 4 分钟。

标签: vba math stochastic


【解决方案1】:

由于一旦序列中出现 0,序列中所有剩余的数字也将是 0,这些都是可能性:(其中下面的 # 表示从 18 的任何数字):

##### (accounts for 8^5 combinations)
####0 (accounts for 8^4 combinations)
...
#0000 (accounts for 8^1 combinations)

因此,答案是(伪代码):

int sum = 0;

for (int x = 1; x <= 5; x++)
{
   sum = sum + 8^x;
}

或者等价的,

int prod = 0;

for (int x = 1; x <= 5; x++)
{
   prod = 8*(prod+1);
}

【讨论】:

    【解决方案2】:

    非常感谢。

    Sub test()
    Dim sum As Single
    
    Dim x As Integer
    For x = 1 To 6
        sum = sum + 8 ^ x
    Next
    Debug.Print sum
    End Sub
    

    使用此代码,我得到了 37488。我也尝试过,例如6个元素,效果也很好。现在我可以尝试估计计算时间

    【讨论】:

    • 我同意@Imaginary 的观点,只是说欢迎自我回答,只要它们是最终解决方案而不是中间进度报告。
    猜你喜欢
    • 1970-01-01
    • 2019-02-09
    • 1970-01-01
    • 2015-11-04
    • 2021-04-23
    • 2021-09-28
    相关资源
    最近更新 更多