`
mikesu
  • 浏览: 69496 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

重拾VC6

阅读更多

     昨完因工作需要写一个生成N到M的不重复随机数列的小程序。所以又把多年前用过的VC6拿出来用了,还好现在网络信息非常发达,否则我还要去翻书呢。用了一个小时把程序写出来了。和多年前用VC6的感觉有很大的区别,对VC6里面的一些概念又有了新的体会,感觉比以前清晰了许多,也许所有的程序都是相通的,Java方面开发经验对VC6也会有帮助。这样的感觉真好。现在都在做Java的Web开发,相比Java觉得一些小程序用VC6实在方便。下面是我在网上找到的一个比较快速简单的生成不重复随机数列的算法:

        如何产生不重复的随机数?最容易想到的方法,是逐个产生这些随机数,每产生一个,都跟前面的随机数比较,如果重复,就重新产生。这是个很笨的方法,且比较次数呈线性增长,越往后次数越多。其实这些比较是多余的,完全可以不进行比较,只要反过来,按顺序产生这些数,但随机产生它们的位置。例如下面产生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的元素。因此它只需要遍历一次就能产生全部的随机数。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics