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

转载 2006年05月22日 18:46:00

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

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

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

面产生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

相关文章推荐

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

http://blog.sina.com.cn/s/blog_57de62c00100ltak.html 如何产生不重复的随机数?最容易想到的方法,是逐个产生这些随机数,每产生一个,...

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

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

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

如何产生不重复的随机数?最容易想到的方法,是逐个产生这些随机数,每产生一个,都跟前面的随机数比较,如果重复,就重新产生。这是个很笨的方法,且比较次数呈线性增长,越往后次数越多。其实这些比较是多余的,完...

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

原文出处:http://blog.sina.com.cn/s/blog_57de62c00100ltak.html 如何产生不重复的随机数?最容易想到的方法,是逐个产生这些随机数,每产生一个,都跟前...

JAVA随机数之多种方法从给定范围内随机N个不重复数

一、JAVA中生成随机数的方式        1、在j2se中使用Math.random()令系统随机选取一个0~1之间的double类型小数,将其乘以一个数,比如25,就能得到一个0~2...

JAVA随机数之多种方法从给定范围内随机N个不重复数

一、JAVA中生成随机数的方式        1、在j2se中使用Math.random()令系统随机选取一个0~1之间的double类型小数,将其乘以一个数,比如25,就能得到一个0~2...

JAVA随机数之多种方法从给定范围内随机N个不重复数

一、Java中生成随机数的方式 1、在j2se中使用Math.random()令系统随机选取一个0~1之间的double类型小数,将其乘以一个数,比如25,就能得到一个0~25范围内的随机数,这个在j...

JAVA随机数之多种方法从给定范围内随机N个不重复数

一、Java中生成随机数的方式        1、在j2se中使用Math.random()令系统随机选取一个0~1之间的double类型小数,将其乘以一个数,比如25,就能得到一个0~2...

【ASP】在特定的范围内产生N个不同的随机数

那么,要在1~20连续产生20个不同的随机数,也就是随机排列1~20,该怎么解决呢?

在0~N(不包括N)范围内随机生成一个长度为M(M <= N)且内容不重复的数组

PS: 代码涉及的随机函数和一些容器虽然是C++的, 但算法是通用的, 这些容器java等其它语言里也都能找到类似的存在. 1. 最朴素暴力的做法. void cal1() { int i = 0,...
  • aa2650
  • aa2650
  • 2013-10-09 15:38
  • 4003
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)