在以给定百分比 1 初始化的数组上使用Knuth Shuffle 。以下实现了 25%:
#include <iostream>
#include <vector>
#include <algorithm>
#include <random>
#include <iterator>
void shuffle(double percentage,std::vector<int> &l) {
if (l.empty()) return;
std::mt19937 gen;
unsigned int N_Ones = static_cast<unsigned int>(floor(percentage*l.size()));
l[0] = (N_Ones > 0)?1:0;
for(unsigned int i = 1; i < l.size() - 1; ++i) {
std::uniform_int_distribution<unsigned int> ui(0,i);
unsigned int j = ui(gen);
l[i] = l[j];
l[j] = (N_Ones > 0)?1:0;
}
}
int main(int argc, char* argv[])
{
unsigned int N = 10;
if (argc >= 1) N = atoi(argv[1]);
std::vector<int> l(N,0);
shuffle(0.25,l);
std::copy(l.begin(),l.end(),std::ostream_iterator<int>(std::cout,""));
std::cout << std::endl;
return 0;
}
请注意,它shuffle()
使用数组的隐式定义,其中第一个N_Ones
条目为 1,其余为 0。对于加密应用程序,您可能希望使用比标准 Mersenne Twister 更好的随机源std::mt19937
。