其实这个算法描述起来很简单: Swap A(i),A(r)A()数组包含你取值范围内的所有值(比如0 to n)。在初始条件下是顺序排列(因为这样简单)。1、原始跳蚤算法: 将数组每个元素A(i)与随机的元素A(r)交换值。则A()的所有元素是随机排列的。 在一个随机排列的A()里面,如果你需要x个随机序列,只要从乱序后的A()里顺序取x个元素就可以了。2、快速跳蚤算法: 如果你只需要x个随机序列,而x<n。将数组前x个元素A(0)到A(x)依次与随机元素A(r)交换,则A(0)到A(x)是随机序列。跳蚤算法是针对Long类型数组操作的。虽然可以用于其他类型甚至数据库,但那样写起来很麻烦。 一般情况下,是将一个表的记录号或者地址存储于long数组,将long数组乱序后,根据随机取得的long类型的记录号取记录,实现随机抽取记录的目的。 通过这种以long数组表示序列号、地址的方式,针对long数组的该算法可以应用于各种用途。在1 to 15当中随机抽取10个的跳蚤算法是这样写的(采用快速跳蚤算法):Randomize TimerDim A(0 to 14) As long Dim I as long Dim T as long Dim R as long'初始化A()。需要说明的是,它里面未必一定是1到15这些数字。可以是其他任意数值(比如15个学生的号码、15道题目在书中的序号)。一般来说只要不重复就好(偶尔例外情况下也有重复的例子)。For I=0 to 14 A(I)=I+1 Next'乱序过程For I=0 to 9 R=Int(rnd*15) T=A(I):A(I)=A(R):A(R)=T '交换A(I)和A(R) Next取A(0)到A(9)这10个元素就是值在1 to 15之间的随机不重复数。如果你想再次取10个随机序列。只要把乱序再来一次就可以了。不用重新初始化。需要说明的是,跳蚤算法只能保证这10个数字没有重复的。但不能保证前后两次取得10个数字的排列是不重复的。好比你从15道题中随机抽取10道给学生,只能保证一道题不会在一个试卷上出现多次。但不能保证每个学生的试卷肯定是一样的。跳蚤算法是我在念高中时候发现的。当时的用途就是帮我的老师随机生成试卷,并且在这个用途中不断改进。完整的跳蚤算法有扫描范围和交换范围的参数,可以十分方便地在指定的范围内(比如题库的第100到200号记录之间)出固定数量的随机题目。这个完整函数就提供在我的Blog里,叫做FleaRandom函数。这个算法是为教育服务的,但不幸的是我发现它更多地被用在博彩方面。
http://blog.csdn.net/KiteGirl/虽然这个算法不是实际用在SQL里面的,但是你可以用“快速跳蚤算法”获得10个随机排列的记录号,然后根据记录号抽取对应数据库记录,达到同样效果。
先谢谢你的Bolg 就去看看
guyehanxinle
谢谢 你给的答案,不过我想在access实现,这个怪我没说清楚
Swap A(i),A(r)A()数组包含你取值范围内的所有值(比如0 to n)。在初始条件下是顺序排列(因为这样简单)。1、原始跳蚤算法:
将数组每个元素A(i)与随机的元素A(r)交换值。则A()的所有元素是随机排列的。
在一个随机排列的A()里面,如果你需要x个随机序列,只要从乱序后的A()里顺序取x个元素就可以了。2、快速跳蚤算法:
如果你只需要x个随机序列,而x<n。将数组前x个元素A(0)到A(x)依次与随机元素A(r)交换,则A(0)到A(x)是随机序列。跳蚤算法是针对Long类型数组操作的。虽然可以用于其他类型甚至数据库,但那样写起来很麻烦。
一般情况下,是将一个表的记录号或者地址存储于long数组,将long数组乱序后,根据随机取得的long类型的记录号取记录,实现随机抽取记录的目的。
通过这种以long数组表示序列号、地址的方式,针对long数组的该算法可以应用于各种用途。在1 to 15当中随机抽取10个的跳蚤算法是这样写的(采用快速跳蚤算法):Randomize TimerDim A(0 to 14) As long
Dim I as long
Dim T as long
Dim R as long'初始化A()。需要说明的是,它里面未必一定是1到15这些数字。可以是其他任意数值(比如15个学生的号码、15道题目在书中的序号)。一般来说只要不重复就好(偶尔例外情况下也有重复的例子)。For I=0 to 14
A(I)=I+1
Next'乱序过程For I=0 to 9
R=Int(rnd*15)
T=A(I):A(I)=A(R):A(R)=T '交换A(I)和A(R)
Next取A(0)到A(9)这10个元素就是值在1 to 15之间的随机不重复数。如果你想再次取10个随机序列。只要把乱序再来一次就可以了。不用重新初始化。需要说明的是,跳蚤算法只能保证这10个数字没有重复的。但不能保证前后两次取得10个数字的排列是不重复的。好比你从15道题中随机抽取10道给学生,只能保证一道题不会在一个试卷上出现多次。但不能保证每个学生的试卷肯定是一样的。跳蚤算法是我在念高中时候发现的。当时的用途就是帮我的老师随机生成试卷,并且在这个用途中不断改进。完整的跳蚤算法有扫描范围和交换范围的参数,可以十分方便地在指定的范围内(比如题库的第100到200号记录之间)出固定数量的随机题目。这个完整函数就提供在我的Blog里,叫做FleaRandom函数。这个算法是为教育服务的,但不幸的是我发现它更多地被用在博彩方面。