查找彼此之间具有不同最小距离的随机数
Finding random numbers in a range that have different minimal distances between each other
我正在编写一个模拟程序"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 个位置可供选择。
相关文章:
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 整数不会重复超过随机数
- 如何修复此错误:未定义对"距离(浮点数,浮点数,浮点数,浮点数,浮点数)"的引用
- if数组上的随机数
- 在将数字随机生成为数组期间从内存输出随机数的数组
- 用C++程序计算圆锥体的体积、球体的体积、八边形的面积和两点之间的距离
- 半随机数生成C++
- 程序在尝试猜测它选择的随机数时进入无限循环?
- 有没有办法在 c++ 中同时生成随机数?如果没有,是否有解决方法?
- 具有随机数的二维数组不会更改
- 随机数未达到限制
- 计算所有对之间的曼哈顿距离
- 我想生成许多矩阵并用随机数填充它
- 如何使用发送数据包所花费的时间计算两个节点之间的距离?
- Levenshtein 两个文件的距离花费了太多时间
- <random>在实践中应该实际使用哪个随机数引擎? std::mt19937?
- 制作具有平均值的随机数生成器
- 为什么 rand 不在我的代码中生成随机数?
- C++ 随机数生成器:尝试将结果作为向量获取,但通过制作 void 函数来执行此操作而出现错误
- 查找彼此之间具有不同最小距离的随机数