我用C++创建了两个不同的随机数矩阵:
a = new int* [IT]();
for (int j = 0; j < IT; j++) {
a[j] = new int[P];
for (int p = 0; p < P; p++) {
a[j][p] = RL.randint(0,100); // I have created the randint function in another cpp file
}
}
b = new int* [OT]();
for (int m = 0; m < OT; m++) {
b[m] = new int[P];
for (int p = 0; p < P; p++) {
b[m][p] = RL.randint(0, 100);
}
}
现在我想实现某种条件:∑(j,p)〖 a(j,p)〗 = ∑(m,p)〖 b(m,p)〗
我在谷歌上没有找到任何可以帮助我的东西,只有一些在总和满足一定目标的情况下生成数字的例子(例如,sumofrandnumbs = 6)。在我的情况下,我没有我想要满足的特定数字,只有两个和必须相同的标准。我在想也许它在excel中生成这个标准下的数字比较容易,然后把它们取到我的cpp文件中,并把它们放入a和b矩阵中。我也不知道怎么做,但我在网上找到了一些信息。你的帮助将意味着很多。非常感谢。
4条答案
按热度按时间ycl3bljg1#
计算速率
K = Sum_of_a/Sum_of_b
。然后,如果
K<=1.0
,则将此K
乘以b
,否则将1/K
乘以a
(此选择是为了保持所有元素值〈= 100)。但是,由于元素类型是int,所以稍后需要进行一些调整(比如重新检查结果总和,并在随机位置添加不足部分)。
niwlg2el2#
我要做的是计算两个和之间的增量,然后更改第二个数组中的增量值以获得相同的和。
在OPL CPLEX中,我会这样写:
它给出了
qpgpyjmq3#
我如何生成两个不同的随机数矩阵[...]?
有很多开源线性代数库,但我在这里只是重新发明轮子,开始写一个(不完整且几乎不能运行)矩阵类。
现在我们已经生成了一个矩阵,可以对其进行变换,使其元素之和保持不变。在标准库中,有一个名为
std::shuffle
的算法2,它对给定范围[first,last]中的元素重新排序,使这些元素的每个可能排列具有相等的出现概率。
我将修改它的一个可能的实现3,这样它将应用一个更通用的转换,而不是仅仅交换两个元素。
我们可以取矩阵中的任意一对元素,改变它们的值,只要它们的和保持不变,全局和也不会改变。
实时:https://godbolt.org/z/a1f5s9v4W
1)https://godbolt.org/z/Ga9841v9a
2)https://en.cppreference.com/w/cpp/algorithm/random_shuffle
3)第3版(随机播放),网址为https://en.cppreference.com/w/cpp/algorithm/random_shuffle#Possible_implementation
nc1teljy4#
你不能在一个迭代步骤中实现它,除非你想在输出上作弊。
你必须为第一个数得到一个随机数矩阵,并将和值存储在某个变量中,然后你需要一次又一次地重复生成第二个矩阵,直到它的和等于第一个,代码看起来像这样
但这种方法是不建议这在所有如果速度是它你正在寻找。
如果p较大,则这将迭代至少几百万次。
时间复杂度将是O((随机数允许长度)(OT*P)),因此,对于3 × 3,该最坏情况是O(1009)。
但是我们可以通过简单的技术来欺骗它,即在第二个数组中生成除最后一个数之外的所有随机数,并通过下式找到最后一个数
代码是这样的
现在这将有一个保证的输出与单迭代无关的概率.但调整一些随机数,使你总是结束了正数在修改值.
如果这有帮助的话,留下一张赞成票是很受欢迎的。