随机从M个元素中选出N个元素操作(不用数组)

时间:2021-07-15 19:54:44
如题  因为写在存储过程中 
貌似是不能用数组写的

M 和 N  都不固定  
M,n作为得到的参数
要从M个元素中随机N个元素进行处理
有什么好办法?

我的问题就在于第二个随机可能会得到和第一次随机相同的结果

我现在要的是这N个元素不重复
就是每个元素只能处理一次

11 个解决方案

#1


每次用数组的长度m作为随机上限,取完i之后,将A[i]同尾元素(第m个元素)交换一下,
然后用数组长度m-1作为上限取随机,这样取n个就可以了!

数据库的话,也大概使这个思路,不知道用的是哪个随机函数?

#2


order by NEWID()

#3


把上次随机到的元素从M中去掉就可以了,再从新随即下一个数,递归简单点。

#4


支持一楼的,实际就是发牌算法

#5


其实我自己倒觉得如果是数据库的话,用order by NEWID()就挺好,不过不是所有数据库都支持!

引用 4 楼 wenzheng38 的回复:
支持一楼的,实际就是发牌算法

#6


存储过程怎么用数组?

#7


order by NEWID()  
具体怎么用
能否详细点

#8


我的解决方法是设置了一个标志位

int i=0;
while i<n
产生随机数作为ID
检查该ID对应的标志位

如果标志位为1什么都不做再次执行循环 continue;

如果标志位为0把这个随机ID提出来并设置标志位为1并i+=1

end while




很想知道order by NEWID() 怎么用

#9


Sql Server 下好像是这样!
select top 10 * from tableName Order by Newid

引用 8 楼 tendollor 的回复:
我的解决方法是设置了一个标志位

 int i=0;
 while i <n
 产生随机数作为ID
 检查该ID对应的标志位

 如果标志位为1什么都不做再次执行循环 continue;

 如果标志位为0把这个随机ID提出来并设置标志位为1并i+=1

 end while


 很想知道order by NEWID() 怎么用

#10


洗牌算法哦。。。这个问题好像在论坛讨论好多次了。。。 .NET板块最近就有2个帖子是搞这个的。。。

#11


主要是存储过程中不能用数组类的  不大好写  我早已经解决了  现在才结贴 不好意思了各位

#1


每次用数组的长度m作为随机上限,取完i之后,将A[i]同尾元素(第m个元素)交换一下,
然后用数组长度m-1作为上限取随机,这样取n个就可以了!

数据库的话,也大概使这个思路,不知道用的是哪个随机函数?

#2


order by NEWID()

#3


把上次随机到的元素从M中去掉就可以了,再从新随即下一个数,递归简单点。

#4


支持一楼的,实际就是发牌算法

#5


其实我自己倒觉得如果是数据库的话,用order by NEWID()就挺好,不过不是所有数据库都支持!

引用 4 楼 wenzheng38 的回复:
支持一楼的,实际就是发牌算法

#6


存储过程怎么用数组?

#7


order by NEWID()  
具体怎么用
能否详细点

#8


我的解决方法是设置了一个标志位

int i=0;
while i<n
产生随机数作为ID
检查该ID对应的标志位

如果标志位为1什么都不做再次执行循环 continue;

如果标志位为0把这个随机ID提出来并设置标志位为1并i+=1

end while




很想知道order by NEWID() 怎么用

#9


Sql Server 下好像是这样!
select top 10 * from tableName Order by Newid

引用 8 楼 tendollor 的回复:
我的解决方法是设置了一个标志位

 int i=0;
 while i <n
 产生随机数作为ID
 检查该ID对应的标志位

 如果标志位为1什么都不做再次执行循环 continue;

 如果标志位为0把这个随机ID提出来并设置标志位为1并i+=1

 end while


 很想知道order by NEWID() 怎么用

#10


洗牌算法哦。。。这个问题好像在论坛讨论好多次了。。。 .NET板块最近就有2个帖子是搞这个的。。。

#11


主要是存储过程中不能用数组类的  不大好写  我早已经解决了  现在才结贴 不好意思了各位