无重复随机数的产生方法
2011-11-07 22:22
417 查看
无重复随机数的产生方法有很多,比较常见和容易理解的方法是
比如要产生11次0-10之间的无重复的随机数,可以先申请一个数组空间 INT a [11],初始化改数组的值全部为-1,然后不停的RAND随机数,如果a中相应的位置为-1,
那么把该位置的值置为该随机值,并打印输出,否则就继续RAND随机数,直到a[11]中无随机数为止
代码如下
上述方法只适合少量数的情况,如果随机数的范围太大的话,算法的时间会急剧上升。
比较好的一种高效算法采用的是置换法,仍就是先申请一个数组比如a[11],为a[11]按照其位置赋予相应的值,比如a[0] = 0.
rand()%11得到一个随机数b,此时b我们可以看做是a数组的下标,打印a[b] 并交换a[11] 与a[b],取随机数的范围减1即rand()%10,因为a[11]已经取到过了.
如此重复,该算法的算法复杂度是稳定的O(N)。
比如要产生11次0-10之间的无重复的随机数,可以先申请一个数组空间 INT a [11],初始化改数组的值全部为-1,然后不停的RAND随机数,如果a中相应的位置为-1,
那么把该位置的值置为该随机值,并打印输出,否则就继续RAND随机数,直到a[11]中无随机数为止
代码如下
int k,i; int a[11]; memset(a,0xFF,sizeof(a)); for(k=0;k<11;k++) { i=rand()%11; while(1) { if(a[i] == -1) { printf("%d ",i); a[i]=i; break; } else i=rand()%11; } }
上述方法只适合少量数的情况,如果随机数的范围太大的话,算法的时间会急剧上升。
比较好的一种高效算法采用的是置换法,仍就是先申请一个数组比如a[11],为a[11]按照其位置赋予相应的值,比如a[0] = 0.
rand()%11得到一个随机数b,此时b我们可以看做是a数组的下标,打印a[b] 并交换a[11] 与a[b],取随机数的范围减1即rand()%10,因为a[11]已经取到过了.
如此重复,该算法的算法复杂度是稳定的O(N)。
class rand_fyl //自己写的产生无重复随机数的类 { public: rand_fyl(int maxNum = 100)//默认返回0-100的无重复的随机数 { p = new int [maxNum+1]; max = maxNum+1; curPos = -1; } ~rand_fyl(){ delete []p; } virtual void Initialize(void); virtual int Rand(void); protected: int *p; int max; int curPos; }; void rand_fyl::Initialize()//初始化, { for(int i = 0; i < max; i++) p[i] = i; curPos = max; srand(time(0)); } int rand_fyl::Rand(void) { if(curPos == 0)//此时所有随机数都已经产生完毕 return -1; int t = rand()%curPos--; int tmp; tmp = p[t]; p[t] = p[curPos]; return tmp; }
相关文章推荐
- PHP产生不重复随机数的方法
- 谈谈无重复随机数的产生方法
- 如何产生不重复的随机数?最容易想到的方法,是逐个产生这些随机数,每产生一个,都跟前面的随机数比较,如果重复,就重新产生。这是个很笨的方法,且比较次数呈线性增长,越往后次数越多。其实这些比较是多余的,
- PHP产生不重复随机数的5个方法总结
- Python 产生特定范围内不重复多个随机数的两种方法
- PHP产生不重复随机数的5个方法总结
- 产生不重复随机数的方法
- PHP产生不重复随机数的5个方法总结(该文章转自酷笔记http://www.kubiji.cn/topic-id3976.html)
- PHP:产生不重复随机数的方法
- PHP:产生不重复随机数的方法
- Java产生不重复随机数方法
- PHP:产生不重复随机数的方法
- PHP产生不重复随机数的5个方法总结
- PHP产生不重复随机数的5个方法总结
- ios之算法-对随机数百分百产生有效不重复处理方法
- C#产生一组不重复随机数的两种方法
- 【Java】利用Collections类下的shuffle洗牌方法改进在一定的范围内产生不重复的随机数
- PHP产生不重复随机数的5个方法总结
- PHP 产生不重复随机数的方法(一)
- PHP产生不重复随机数的5个方法总结