参考:https://www.cnblogs.com/jiading/p/11653911.html
#include <iostream>
#include <random>
#include <vector>
#include <time.h>
#include <Windows.h>//按从上到下顺序前两个需要这个头文件所以不能跨平台只能windows
#include <sys/timeb.h>
#include <chrono>//为了生成纳米级的随机数种子具体可自行百度
#define MAX 100
using namespace std;
using namespace std::chrono;
int compute(vector<double> _test) {
//将传过来的动态数组归一化
int size = _test.size();
double sum = 0;
vector<double> normalzation(size);
for (int i = 0; i < size; i++) {
sum += _test[i];
}
for (int i = 0; i < size; i++) {
normalzation[i] = _test[i] / sum;
// cout << "归一化数组" << normalzation[i] << endl;
}
//以高精度计算器值生成随机数种子(windows)
LARGE_INTEGER nFrequency;
if (::QueryPerformanceFrequency(&nFrequency)) {
LARGE_INTEGER nStartCounter;
::QueryPerformanceCounter(&nStartCounter);
::srand((unsigned)nStartCounter.LowPart);
}
unsigned int crand = rand() % MAX;
//使用C++11的随机数uniform_int_distribution
unsigned int crand;
LARGE_INTEGER nFrequency;
if (::QueryPerformanceFrequency(&nFrequency)) {
LARGE_INTEGER nStartCounter;
::QueryPerformanceCounter(&nStartCounter);
default_random_engine e(static_cast<unsigned int> ((unsigned)nStartCounter.LowPart));
uniform_int_distribution<> u(0, MAX);
crand = u(e);
}
crand = rand() % MAX;
//使用chrono生成随机数种子(跨平台)
unsigned int crand;
random_device rd;
mt19937 mt(rd());//由于rd生成与电脑设备有关,不够随机,
//故选择随机引擎(默认、线性、梅森、斐波那契)的实现类,
//将rd的随机结果传入作为种子来生产更随机的数
uniform_int_distribution<unsigned> u(0, MAX);
crand = u(mt);
//cout << "生成的数字:" << crand << endl;
//返回0-size中随机的一个数,本质上看它在哪个范围,概率越大所占范围越大
for (int i = 0; i < normalzation.size(); i++) {
double judge = 0, com = 0;
for (int j = 0; j <= i; j++) {
judge += normalzation[j];
}
com = MAX * judge;
//cout << "生成数字所在范围判断:" << com << endl;
if (crand <= com) {
return i;
}
}
return 0;
}
int main()
{
int aa = 0, bb = 0, cc = 0;
vector<double> a = { 0.6,0.8,0.2 };//每个结果所占的概率可灵活更改
vector<int> res_(a.size());
for (int i = 0; i < 1000; i++) {//执行1000次看结果
int ret = compute(a);
cout << i << ":" << ret << endl;
res_[ret]++;
}
for (int i = 0; i < res_.size(); i++) {
cout << "R" << i << ":" << res_[i] << endl;
}
}