如何产生以下要求的随机整数?(效率要尽量快,最好能矢量化)
一直以来,对此随机整数产生问题都很无力,这个问题源于差分进化算法中的选择过程:问题的简单描述:
假如有 1到n 范围内的整数 ,
从中随机的选出不重复的三个随机整数构成一个组合,
试产生这样的组合若干个:
如在 1到10 中产生若干这样的组合:
ans =
2 ,4 ,6
7 ,9 ,3
1 ,5 ,2
3 ,6 ,2
8 ,5 ,1
7 ,2 ,4
。。。。。
现在有两个方案,但效果并不好:
方案一:
sq = randperm(n); arrayNeed = sq(1:3);
这种方案时间耗费太大(大概因为randperm的机制是将随机数排序完成选择的),
因为算法运行的次数高达几十万次,严重拖慢速度
方案二: 产生一个数组:
array = 1:n;
产生一个1到n的整数:
rand1 = mod(floor(rand*n),n))+1 ,
从而得到:第一个要求的随机数:
randNumberOne = array(rand1);
然后另 array 数组在rand1 位置的元素为空:
array(rand1) = [];
接着,重复上述过程,选择1到n-1间的随机数 rand2 等等
方案二的效率同样不容乐观 ,因为反复的对数组进行内存的操作,降低了效能,
诚恳地想和大家交流,请大家集思广益,帮我解决这个困扰我依旧的问题。
谢谢大家!
[ 本帖最后由 lilongduzhi 于 2009-11-16 22:17 编辑 ] 可以直接用组合命令产生,help nchoosek
如:
a=nchoosek(1:10,3);
b=a(randperm(nchoosek(10,3)),:); 试试下面代码:
function r=randnchoosek(n,k)
ln=length(n);
for i=1:k
ind=i-1+unidrnd(ln-i+1);
a=n(ind);
n(ind)=n(i);
n(i)=a;
end
r=n(1:k);
n越大,k越小,相对randperm越有优势
页:
[1]