【问题标题】:c++ algorithm to select two random numbers from a range, with minimal distancec ++算法从一个范围内选择两个随机数,距离最小
【发布时间】:2017-06-06 14:10:50
【问题描述】:

我有一个用 1 到 100 的数字初始化的 std::vector

std::vector<int> vec;
for(int i = 1; i < 101; i++)
  vec.push_back(i);

我想选择两个具有最小距离的随机整数(例如最小距离可以是 10)。

如果 num1, num2 是数字:

num2 - num1 > 距离

我正在使用以下方法在范围之间选择一个随机整数:

int getRandomValue(int from, int to)
        {
                std::random_device seeder;
                std::mt19937 engine(seeder());
                std::uniform_int_distribution<int> dist(from, to);
                return dist(engine);
        }

如何生成 num2 和 num1?

【问题讨论】:

  • 使用相同的方法,然后[0, std::numeric_limits&lt;int&gt;::max] ?
  • 1) 选择 dist D = 5 2) 选择随机索引 A = rand(0 to (N - D)) 3) 选择索引 B = A + D
  • 您想要固定距离还是最小距离?您的问题对两者都有要求。
  • @NathanOliver 谢谢。我需要一个最小的距离。我会更新
  • OT:您可能希望您的 mt 为 staticthread_local,这样您就不必在每次通话时都重新播种。否则,如果你一直在调用它,你可以直接使用random_device。此外,可以改进播种以查看 mt 的整个状态空间,例如参见我的问题here

标签: c++


【解决方案1】:

你可以使用类似下面的东西:

num1 = getRandomValue(minRange, maxRange - distance - 1);
num2 = getRandomValue(num1 + distance + 1, maxRange);

请注意,这不是对结果的均匀分布。

【讨论】:

  • 您的代码不适用于边缘情况。如果num1 == maxRange-distance 然后num2 = maxRange。这不满足num2-num1 &gt; distance。建议num1 = getRandomValue(minRange, maxRange-distance-1)num2 = getRandomValue(num1 + distance + 1, maxRange)
  • 抱歉,距离应该最小 10 并且不是固定的
  • @Peter,没错,需要 -1 和 +1 才能满足极端情况。
【解决方案2】:

您可以将每个示例随机化 num1 并将距离相加,然后您就有 num2。

但你必须小心,因为 num1 必须小于或等于 100 距离

或对面将 num2 从 10 随机化到 100 并且 num1 = num2-distance

【讨论】:

  • 抱歉,距离要小,不能固定
【解决方案3】:
#include <cstdlib>

a = rand() % 90;
b = a + 10;

a 越小,b 越大

【讨论】:

  • OP 希望最小范围为 10。这给了他们一个固定的范围。
猜你喜欢
  • 1970-01-01
  • 2020-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-17
  • 2021-11-13
  • 1970-01-01
  • 2014-07-09
相关资源
最近更新 更多