不重复随机数的生成

Q: 在min 和 max之间生成n个不重复的随机数?

A1:重复检验:

一次生成一个随机数rand,然后查找已生成随机数组arr中是否存在这个随机数,若有不插入,继续生成,直到arr中有n不重复的随机数。

A2:乱序生成:

乱序生成借鉴了shuffle的思想。a[n]中存放1—n的整数,我们随机打乱,取前K个数,即为K个不重复的随机数,随机数的范围是1—n。 详细之:定义a[max-min]的数组,然后依次存入min—max.随机乱序,任取或直接取前n个数。乱序可以直接对前n个元素与数组n中任意元素交换位置。重点是随机乱序。

A3:线性随机:

线性随机是指生成的随机数是“线性”增长的,这个线性的K值是不确定的,仅是表明下个随机数是以前一个随机数做base,然后加上一个随机因子randkey,生成的随机数存放的位置再随机下就ok了。这种方法需要注意的是怎么能在min和max之间生成,而不越界。关键就在随机因子,考虑每次随机因子的都假设是最大值,则随机因子的范围是(max-min)%n;由此可以看出,第一个随机数的范围虽是随机的,但这个范围被固化在min—–(max-min)%n之间了,所以看起来不是那么随机。这种方法虽说不好,但贵在思想,是 重归混沌 想出来的,发个糖。哈哈。

A4:移形换位:

思想和A2相似。均是先生成随机数范围的数组,然后随机位置。略有不同的是,A2随机出的位置是用于swap,这个随机出的位置是直接用于随机数,但怎么避免不重复呢?还是交换,随机过的位置交换到数组尾,然后,随机因子减 1,即这个已经随机出的数组,就不会再被随机到,大体思想和A2差不多。

 posted on 2014-07-21 09:58  chagmf  阅读(276)  评论(0)    收藏  举报