随机数生成算法优化
如果一个数,比如100,要随机分给四个变量a,b,c,d,有什么比较好的方法,
方法一
1.把100先让a选,如果a = 34;
2.64再让b选,如果b = 50;
3.14让c选 ,如果c = 10;
4.d = 4;
问题,产生大数的概率很大。。。。。
方法二,
循环随机生成四个数,一直循环到相加等于100
这种方法就不想说了,效率之低。
有没有好的方法推荐下我,谢谢
[解决办法]
这样子:
先随机产生a+b=t1;
再随机产生a;
剩下的 b=t1-a
剩下的给c+d=100-t1;
随机产生c;
剩下的d=100-t1-c;
[解决办法]
意思是4个数的和为100么?
生成3个0-100的随机数,排个序R[0]为第一个数,R[1]-R[0]为第二个数,R[2]-R[1]为第3个数,100-R[2]为第4个数
[解决办法]
- C/C++ code
//采用4楼的方法//但发现一次打乱的结果,不不太好,所以使用多次打乱//试验10000次,每个数的平均值接近25,比较公平了。#include <cstdio>#include <vector>#include <ctime>#include <utility>#include <algorithm>#include <iostream>using namespace std;class CDistribute{public: explicit CDistribute(int Num, int Sum): m_Num(Num), m_Sum(Sum) { //[IN]Num: 数的个数,本例为4 //[IN]Sum: 数的和,本例为100 srand( (unsigned)time(NULL) ); } void GetResult(vector<int>& Result) { //获得结果 //[OUT] Result: 存放结果 int tempNum = m_Num; int tempSum = m_Sum; int remains/*余数*/; Result.resize(m_Num,0); while(1) { if( tempNum-1 == 0) //如果是第一个数,就把余下的数给它 { Result[0] = tempSum; break; } //方案一:这里得到的数范围为0至100 //if(tempSum == 0) break; //remains = rand()%(tempSum+1); //方案二:这里得到的数范围为1至97 remains = rand()%(tempSum-tempNum+1)+1; //先赋值Result最后一个元素,然后依次向前 Result[ tempNum-1 ] = remains; tempSum -= remains; tempNum--; } //打乱次序,每次打乱都花费线性时间 random_shuffle ( Result.begin(), Result.end() ); random_shuffle ( Result.begin(), Result.end() ); random_shuffle ( Result.begin(), Result.end() ); random_shuffle ( Result.begin(), Result.end() ); random_shuffle ( Result.begin(), Result.end() ); } virtual ~CDistribute() { }private: int m_Num; int m_Sum;};void Print(vector<int> v){//打印结果 vector<int>::iterator it; for(it = v.begin(); it != v.end(); ++it) { cout<<*it<<" "; } cout<<endl;}int main() { CDistribute d(4,100); vector<int> Result; vector<int> g(4,0);//用于评估分配是否公平 //输出10000个结果 for(int i=0; i<10000; i++) { d.GetResult(Result); Print(Result); for(int k=0; k<4;k++) g[k] = g[k] + Result[k]; } //打印评估的平均值 cout<<"平均值:"<<endl; vector<int>::iterator it; for(it = g.begin(); it != g.end(); ++it) { cout<<*it/10000.0<<" "; } cout<<endl; return 0;}
[解决办法]
随意取4个随机数a,b,c,d,算s=a+b+c+d,然后 a = a * 100/s, b = b * 100 / s, c = c * 100 / s, d = 100-a-b-c