关闭

如何高效产生m个n范围内的不重复随机数(m<=n)

734人阅读 评论(0) 收藏 举报

        如何产生不重复的随机数?最容易想到的方法,是逐个产生这些随机数,每产生一个,都跟前面的随机

数比较,如果重复,就重新产生。这是个很笨的方法,且比较次数呈线性增长,越往后次数越多。其实这些

比较是多余的,完全可以不进行比较,只要反过来,按顺序产生这些数,但随机产生它们的位置。例如下

面产生100个100以内不重复随机数的代码:

int a[100];
for(i=0; i<=99; ++i) a[i]=i;
for(i=99; i>=1; --i) swap(a[i], a[rand()%i]);

上面这段代码只需要遍历一次就可以产生这100个不重复的随机数,它是如何做到的呢?首先第二行按顺

序用0到99填满整个数组;第三行,是随机产生从0到m-2个数组下标,把这个下标的元素值跟m-1下标的元

素值交换,一直进行到下标为1的元素。因此它只需要遍历一次就能产生全部的随机数。

        再看下面的代码,原理跟上面例子相似,但效率比上面的差点,但仍不失为一个好方法:

int a[100]={0};
int i, m;
for(i=1; i<=99; ++i)
{
        while(a[m=rand()%100]);
        a[m] = i;
}

这段代码也是随机产生位置,但它预先把整个数组初始化为0,然后随机产生其中一个位置,如果该元素

值为0,表示这个位置还没有被使用过,就把i赋予它;否则,就重新随机产生另一个位置,直到整个数组

被填满。这个方法,越到后面,遇到已使用过的元素的可能性越高,重复次数就越多,这是不及第一个方

法的地方,但总的来说,效率还是不错的。



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=524221

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:52366次
    • 积分:721
    • 等级:
    • 排名:千里之外
    • 原创:14篇
    • 转载:31篇
    • 译文:0篇
    • 评论:18条
    文章分类
    最新评论