gpt4 book ai didi

arrays - 如何在满足以下约束的 n 个元素的数组中分配随机值?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:47:13 25 4
gpt4 key购买 nike

假设 a 是我的 n 元素数组。

约束:

  1. alpha <= a[i] <= beta。
  2. 0 <= alpha <= beta <= 1。
  3. a 中所有元素的总和应正好为 1。

假设对于给定的 alpha 和 beta 值,这样的数组总是可能的

这是我的想法:

在 alpha 和 beta 之间随机分配值。查找数组元素的总和。如果 sum>1,则用 x 减去所有元素以满足约束条件。如果 sum<1,则添加所有带有 x 的元素以满足约束条件。

但我发现很难找到新映射的值。

最佳答案

这可以满足当且仅当 alpha × n ≤ 1 ≤ beta × n。

您可以通过选择 n 个随机数来做到这一点。令 ri 为第 ith 个随机数,令 R 为随机数之和,S = (beta - alpha)/(1-n×alpha) × R. 设置 a[i] = alpha + ri/S * (beta - alpha)。只要 S 不小于最大随机数,那么 a 的所有元素都在 alpha 和 beta 之间,并且它们的和为 1。

#include <iostream>
#include <cassert>
#include <random>
#include <vector>
#include <algorithm>
#include <iterator>

int main() {
const double alpha = 0.05, beta = 0.15;
const int n = 10;

if (!(n * alpha <= 1.0 && 1.0 <= n * beta)) {
std::cout << "unable to satisfy costraints.\n";
return 0;
}

if (alpha == beta || std::fabs(1.0 - n * alpha) < 1e-6 || std::fabs(1.0 - n * beta) < 1e-6) {
std::cout << "Solution for alpha = " << alpha << ", beta = " << beta << " n = " << n << ":\n";
std::fill_n(std::ostream_iterator<double>(std::cout, " "), n, 1.0/n);
std::cout << "\nSum: 1.0\n";
return 0;
}

std::vector<int> r;
double S;

{
std::random_device rd;
std::seed_seq seed{rd(), rd(), rd(), rd(), rd(), rd(), rd(), rd()};
std::mt19937 eng(seed);
std::uniform_int_distribution<> dist(0, 1000);

do {
r.clear();
std::generate_n(back_inserter(r), n, std::bind(dist, std::ref(eng)));

int sum = std::accumulate(begin(r), end(r), 0);
S = (beta - alpha) / (1 - n * alpha) * sum;
} while (S < *std::max_element(begin(r), end(r)));

}

std::vector<double> a(n);
std::transform(begin(r), end(r), begin(a), [&] (int ri) { return alpha + ri/S * (beta - alpha); });

for (double ai : a) {
assert(alpha <= ai && ai <= beta);
}

std::cout << "Solution for alpha = " << alpha << ", beta = " << beta << " n = " << n << ":\n";
std::copy(begin(a), end(a), std::ostream_iterator<double>(std::cout, " "));
std::cout << '\n';
std::cout << "Sum: " << std::accumulate(begin(a), end(a), 0.0) << '\n';
}

Solution for alpha = 0.05, beta = 0.15, n = 10:
0.073923 0.117644 0.0834555 0.139368 0.101696 0.0846471 0.115261 0.0759395 0.0918882 0.116178
Sum: 1


您没有指定您希望算法提供的特定分布,但我想我要指出的是,该算法不一定以相等的概率产生所有可能的解决方案;我相信有些解决方案比其他解决方案更有可能产生。

关于arrays - 如何在满足以下约束的 n 个元素的数组中分配随机值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33538249/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com