快速生成1000万个不重复数字的算法?

来源:百度知道 编辑:UC知道 时间:2024/05/12 16:17:23
Pascal
写了一个随机函数用来生成这么多数字,一个Boolean去判断是否重复。
但是发现如果这个随机函数一直都随机到那些已经选择过的,那程序一下子变得很慢。
有没有更快的判断机制和生成机制?
看上去xkwy2006的随机读取的方法好像不错,但是其实原理基本和我原先用的一样,只是换了一种实现方式。还是很慢。主要是开头这个“某种规律”到底怎么写呢- -!
diyu900的意思意思也是一样,只是从布尔改成了地址……每生成一个数去判断这个数字是否重复,这真是个大工程。
CJSCWJ 的答案最经典,不知道我是不是理解错误?先用生成随机步长递增的方法生产一串数字,生成数字同时在生成一串随机数,给他们一一对应。然后根据这串随机数来排序,得到的就是一串没有顺序的随机数。
但是这样我不太明白步长如何控制?如果第一次出现的步长是89,那有我可能生成下一组的时候生成出来个178,这么一来不是要有很多重复了?

假设我要在10000000 - 99999999之间产生100万个不重复的随机数。可以建立一个表table1,这个表有两个字段,一个是所产生的随机数字段(int型),另外一个也是int型字段。
使用99999999 - 10000000 =89999999 整除 1000000 = 89(舍去)。然后从10000000开始循环1000000次,从10000000开始每一次加89,
即10000000、10000089、10000178...
然后每循环一次,使用newid生成一个随机数,将这两个数做为值插入table1中。即第一个字段插入按步长89递增的数,第二个数是使用newid随机生成的数。这样,table1就有100万条记录了,不过随机值是顺序的。但由于第二个字段是随机的,因此,只要按第二个字段排序,第一个字段上的值就是随机的。

这样做不用检查重复值就可以保证得到1000000个无重复的随机数。而且它们是均匀分布在10000000到99999999之间。
当然,也可以随机变化89的步长,使其更加随机。
这样做还有一个好处,可以分批地生成记录,然后一起插入表中。如一次产生1000条这样的记录,插入后再产生下一千条记录。这样只要循环1000次就可完成。

至于代码,很简单,自己写吧,这里只给出思路!!

首先声明我不懂Pascal,不过我有个主意不知道行不行?
先用一个指令来自动生成1000万个数,比如从二到一千万零二,这一1000万个数按某种规律顺序生成,这样就不会重复。再用一个指令来从这1000万个数中随机读取,每用完一个数就把他删掉,下次从剩余的数里读取。
假设我要在10000000 - 99999999之间产生100万个不重复的随机数。可以建立一个表table1,这个表有两个字段,一个是所产生的随机数字段(int型),另外一个也是int型字段。
使用99999999 - 10000000 =89999999 整除 1000000 = 89(舍去)。然后从10000000开始循环1000000次,从10000000开始每一次加89,
即10000000、10000089、10000178...