我正在尝试为几个团队随机生成一个双循环计划,以团队为线,以回合为列。每支球队被安排为与其他球队对决两次,一次为主场比赛的对手分配正值,一次为客场负值。
该代码将类似于以下内容,除了它适用于2D数组而不是1D,其中从2D的每一行的element(team,round)元素的可能随机值中删除了某些“K”和“-K”数组,而不是固定值。
K是确保团队不匹配的#行(例如,在分配第2行时使k = +-2在“dist {}”中的权重= 0,因此不会出现“2”和“-2” (作为第2队为自己(主场或客场)分配的对手),但此移除不应是永久的,因为在日程表数组的其他行中,第#K队是有效的对手。
是否有一项功能可以让每条线(团队)的随机数取不同的k?还是可以用srand()来做?
#include <functional>
#include <iostream>
#include <ostream>
#include <random>
int main()
{
std::random_device rd;
unsigned long seed = rd();
std::cout << "seed " << seed << std::endl;
std::mt19937 engine(seed);
// Distribution {0, 1, 2, 4, 5}
std::discrete_distribution<> dist {{1, 1, 1, 0, 1, 1}}; // 3 given 0 weight(chance).
auto rng = std::bind(dist, std::ref(engine));
const int n = 10;
for (int i = 0; i != n; ++i)
{
int x = rng();
std::cout << x << std::endl;
}
return 0;
}
最佳答案
我想你要这个
std::discrete_distribution<> make_dist(int k, int N)
{
std::vector<int> dist(N,1);
dist.at(k) = 0;
return std::discrete_distribution<>(dist.begin(), dist.end());
}
更换你的
std::discrete_distribution<> dist {{1, 1, 1, 0, 1, 1}}; // 3 given 0 weight(chance).
与
auto dist = make_dist(3,6);
关于c++ - 如何从随机值范围中删除某个元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60658736/