查找彼此之间具有不同最小距离的随机数

Finding random numbers in a range that have different minimal distances between each other

本文关键字:距离 随机数 彼此之间 查找      更新时间:2023-10-16

我正在编写一个模拟程序"Core War"。我需要在给定的内存范围内为 x 数量的程序生成随机位置。它们将永远适合记忆。

程序有一定数量的行。我需要将它们随机放置在内存中,这样它们就不会相互重叠。我正在寻找起跑线位置:

示例 - 对于输入:

memorySize = 50;
programCount = 3;
programLengths = [3, 7, 4]

该函数必须为 3 个程序长度输出 3 个位置,这些位置:

  • 从 0 到 49
  • 不能以任何方式与其他程序重叠,例如,如果输出将是[0, 2, 20],第一个和第二个程序将重叠,因为第一个程序的长度是 3 行,这意味着最后一行将在索引 2 上。第二个计划将与第一个程序重叠。

我尝试为2个程序制作一个函数,但它太复杂了,我只是将第一个设置为零并随机选择另一个:

std::pair<size_t, size_t> findStartingPositions()
{
// first.size and second.size are lengths of programs
size_t posFirst = 0;
std::mt19937 mt_rand(time(0));
size_t posSecond = mt_rand() % (MEMORY_SIZE - second.size - first.size);
posSecond += first.size;
return { posFirst, posSecond };
};

但我想要一种更好、更具可扩展性的方法。


这些是可用的变量:

std::vector<Program> programs; // program[0].size() returns the length of the first program
size_t memorySize;

如果可能的话,梅森纳捻线机的答案将是最好的。

假设所有程序的大小均为 1,那么,您可以简单地洗牌整个竞技场。

现在要处理不同的大小,只需考虑第一条指令和

  • 按节目长度减小竞技场大小。
  • shuffle整个(小(竞技场。
  • 重建整个竞技场(在第一个竞技场之后插入指令(

在示例问题中,有 36 行不在程序中,保持为空。

随机洗牌 5 个程序以确定它们的顺序,然后随机选择它们将入到 36 个空行列表中的 3 个位置。 请注意,包含 36 行的列表有 37 个位置可供选择。