create proc suijishu
@weishu int,@hangshu int
as
declare @temp table
(
id int identity(1,1),
zhi varchar(10)
)
declare @js int
declare @zhi varchar(10)
declare @i varchar(10)
declare @j int
set @j=0
while 1=1
begin
--唯一的随机数插入表@temp
set @zhi=''
while 1=1
begin
set @i =''
set @j=round(rand()*10,0)
--如果是10就置为0
if @j>=10
set @j=0
set @i=rtrim(convert(varchar(10),@j))
set @zhi=@zhi+@i
if len(rtrim( @zhi))>=@weishu
break
end
--判断是否唯一
if not exists(select * from @temp where zhi=@zhi)
insert @temp values(@zhi)
select @js=count(*) from @temp
if @js>=@hangshu
break
end
select * from @temp
例如:产生5个不重复的7位随机数
exec suijishu 7,5
传两个参数,
第一个参数:每个随机数的位数
第二个参数:产生随机数的个数
结果:
id zhi
1 9049637
2 0788233
3 7486321
4 5466539
5 2484970
确保不重复的情况下 给这个键做索引 或者 在匹配步骤上将数据库的所有数值分批次取出存入到缓存中 利用高IO去完成匹配。另外 关于 7位数字的生成 可以以1000000为基础去自增的形式生成。按照你的随机数理念 越到后面count的效率越低。
换一种思路,看下面代码(其实能够使用数据库sql语句的话,更简单,临时表,两个字段,一个字段插入随机guid,一个插入字段数1--35。用guid排序取前7个):import java.util.Date
import java.util.Random
/* * 随即排列数组,给定一个数组,随即排列其中的元素,目前主要有两种方法 */
public class RandomSort {
public static void main(String args[]){
//生成一个数组,并赋值。1-35.
int data[]=new int[35]
for(int i=0i<35i++)
{
data[i] = i+1
}
//把数组打乱
randomizeInPlace(data)
//显示打乱后的数据
show(data)
//show(data)可以稍微修改为,显示前7个数。这里就不写了,你自己写吧
}
/*
* 元素data[i]是从 元素data[i]到data[n]中随机选取的
*/
private static void randomizeInPlace(int[] data)
{
Date dt=new Date()
Random random=new Random(dt.getSeconds())
int len=data.length
for(int i=0i<leni++)
{
int pos=(int)(random.nextDouble()*(len-i+1)+i)-1
int temp=data[i]
data[i]=data[pos]
data[pos]=temp
}
}
private static void show(int[] data)
{
System.out.println("========================")
for(int i = 0i <data.lengthi++)
{
System.out.print(data[i] + "")
}
System.out.println()
System.out.println("========================")
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)