现在的位置: 首页 > 综合 > 正文

随机生成[s,e]之间的m个整数

2012年11月18日 ⁄ 综合 ⁄ 共 600字 ⁄ 字号 评论关闭

随机生成[s,e]之间互不相同的m个整数
这样考虑:从n(e-s+1)个整数取m个数,那么每个数取到的概率是m/n。
怎么应用这一点呢?
可以这样:随机生成[1,n]之间的一个整数,如果这个数小于等于m就表示满足了m/n的概率,即概率m/n的事件发生了。
数学上的证明大概是很繁琐吧,不懂~~~
代码实现如下:

//随机生成[s, e]之间的m个互不相同的数,并放存入p[]中
void GetRandomNum(int *p, int s, int e, int m)
{
    assert(p);
    int k=0;
    srand(time(NULL));
    for (int i=s; i<=e&&m; i++)
    {
        //rand()%(e-i+2):随机生成一个[1, e-i+1]之间的整数
        if ((1+rand())%(e-i+2) <= m)
        {
            p[k++] = i;
            //printf("%d\n", i);
            m--;
        }
    }
}

另外一个问题:随机生成和为S的N个整数
解决这个问题有多种方法,其中投影法要用到上面的算法
假设要生成和为15的6个数,利用GetRandomNum得到5个数1, 3, 6, 8, 14,如下图,我们在数轴上标识这六个数

可知,OA+AB+BC+CD+DE+EF必然等于15。它们的长度之和分别为
1, 2, 3, 2, 6, 1
这就找到了一个组合:1+2+3+2+6+1 = 15
总结:1 随机生成[1, S)之间的N-1个整数,然后加上S构成N个整数。2 按顺求出它们之间的差。

抱歉!评论已关闭.