【问题标题】:Combine randomized evenly distributed numbers into one array将随机均匀分布的数字组合成一个数组
【发布时间】:2014-12-29 11:56:41
【问题描述】:

我有 N 个均匀分布的项目 (std::random_shuffle) 的数组(技术上是 STL 容器)。然后我检查这些数组并使用一些与这些项目无关的逻辑选择这些项目的不同数量(从 0 到 K)并将其推送到结果数组。这个结果数组是否代表一个均匀分布的项目数组?

伪代码:

std::vector<int> userInput;
userInput.push_back(1,3,6);
std::map<int, vector<int>> storage;
std::vector<int> result; 
for (auto i = 0; i < 10; ++i)
{
    std::vector<int> vec;
    for (auto j = 0; j < 10; ++j)
    {
        vec.push_back((i+j)*(10*(i+1)));
    }
    std::random_shuffle(vec.begin(), vec.end());
    storage.emplace(std::make_pair(i, std::move(vec));
}
for (auto k = 0; k < 10; ++k)
{
    vector<int> indices = someLogicHere(storage[k],userInput))
    for (auto index : indices)
    {
        result.push_back(storage[k][index]);
    }
}

假设 std::random_shuffle 为我们提供了均匀分布 “结果”向量是否均匀分布?

【问题讨论】:

  • 您能以代码或伪代码的形式发布您的算法吗?
  • 未指定。如果向量如伪代码中所示,storage[k] 中的值与k 相关,并且没有迹象表明从someLogicHere(storage[k]) 返回的向量大小与k 无关。事实上,someLogicHere 可以检查storage[k] 的各个值,因此它可以直接引入偏差。我根本看不出random_shuffle 有什么相关性(但无论如何都要考虑切换到shuffle。)
  • 如上所述,逻辑与存储在向量中的值无关,而仅与键有关。假设 someLogicHere 从用户输入(要获取的键列表)中获取值,并且仅当“key mod 2 == 0”时

标签: algorithm random language-agnostic


【解决方案1】:

这完全取决于someLogicHere(storage[k],userInput))是否尊重均匀分布。

一旦完成,您的伪代码中没有任何内容会改变洗牌。您的“逻辑与项目无关”的声明似乎可以保证这一点,但伪代码本身并不能保证相同。

不过,一般来说,someLogicHere 引入的任何偏差都会消除一致性,因为初始集合具有最大熵。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-12
    • 1970-01-01
    • 2014-02-04
    • 1970-01-01
    • 2011-08-08
    • 2019-07-03
    • 2012-04-11
    • 2021-12-28
    相关资源
    最近更新 更多