如何生成从范围 0 到 m (m<n) 的均匀分布的 n 排列
how to generate evenly distributed n-permutation from range 0 to m (m<n)
允许重复一个数字,但概率有限
例如:给定一个数字序列0-8,我想生成一个25个数字的随机序列,一个数字的最大重复时间为3。
一种相对万无一失的方法是拒绝采样。独立生成 25 个数字。如果任何数字出现超过 3 次,请将它们全部扔掉,然后重试。此方法的最坏情况性能较差,但它非常简单,您不必担心意外引入了不需要的相关性。
据我了解,您需要这样的东西(根据下面的评论进行了返工):
#include <stdlib.h>
#include <time.h>
#include <vector>
#include <iostream>
using std::vector;
using std::cout;
vector<int> Generate(const vector<int> & numbers, int generateN, int maxRepeatN)
{
vector<int> longList(numbers.size() * maxRepeatN);
for(int i = 0; i < numbers.size(); i++)
for(int j = 0; j < maxRepeatN; j++)
longList[i * maxRepeatN + j] = numbers[i];
vector<int> result(generateN);
for(int i = 0; i < generateN; i++)
{
int id = rand() % longList.size();
result[i] = longList[id];
longList.erase(longList.begin() + id);
}
return result;
}
int main()
{
srand((unsigned)time(0));
vector<int> numbers = {0, 1, 2, 3, 4, 5, 6, 7, 8}
vector<int> result = Generate(numbers, 25, 3);
for(int i = 0; i < result.size(); i++)
cout << result[i] << " ";
return 0;
}
算法的想法是,你创建所有可能的数字的长列表(它保证你不会得到超过一种类型的最大数字)。然后你从中得到一个一个的数字(从长列表中删除数字保证分布)。*此代码仅供参考,使用 std::vector 根本不是最佳选择。
相关文章:
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 为什么不;名字在地图上是按顺序排列的吗
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 按对象的特定方法按升序排列的C++优先级队列
- 找到具有最多子串栅栏的字符串排列
- 重新排列单线以形成闭合多边形?
- 在数组中输入 n 个整数的列表,并以类似于钟摆来回移动的方式排列它们. 输入-1 3 2 5 4,输出5 3 1 2 4
- 输入的 C++ 排列
- 公共/私有/受保护是否会更改内存中结构的排列?
- 如何在 C/C++ 中生成具有 n 组 5 个值(重复项)的所有可能排列的矩阵
- 在向量C++中排列奇数和偶数
- 改变或缩放两个正态分布以具有特定的相关系数
- 如何创建没有特定定义的随机分布?uniform_int_distribution是从其他类继承的吗?
- 如何进行排列?
- 矩阵行求和与 RowMajor 和 ColMajor 数据排列的奇怪性能差异
- 在 CPP 中打印具有重复项的选定长度字符的所有排列
- 如何在不使用 C++ 中的数组或函数的情况下查找 N 位数字的所有排列
- 调用参数排列不变函数 f(i++, i++)
- 伪随机分布,它保证了值序列-C++的所有可能的排列
- 如何生成从范围 0 到 m (m<n) 的均匀分布的 n 排列