读书人

随机数生成算法优化,该怎么解决

发布时间: 2012-03-20 14:01:10 作者: rapoo

随机数生成算法优化
如果一个数,比如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

读书人网 >软件架构设计

热点推荐