如何高效产生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)

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

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

算法:如何高效产生m个n范围内的不重复随机数(m
  • shi0090
  • shi0090
  • 2014年12月02日 07:22
  • 4897

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

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

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

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

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

。。。。
  • varyall
  • varyall
  • 2017年12月08日 17:15
  • 10

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~2...

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

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

简单但比较高效的解决:随机获取N个数字,这些数字在指定的范围内,获取的数字不能重复

在做游戏的时候遇到这个问题:随机指定范围的数字,但不能重复。 一开始的想法是:用一个双循环,直接用【rand()%范围数字】的方法得到一个数字,然后和数据结构里面的已有元素进行比对,如果重复就不添加,...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何高效产生m个n范围内的不重复随机数(m<=n)
举报原因:
原因补充:

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