lilongduzhi 发表于 2009-11-16 22:13

如何产生以下要求的随机整数?(效率要尽量快,最好能矢量化)

一直以来,对此随机整数产生问题都很无力,这个问题源于差分进化算法中的选择过程:

问题的简单描述:
假如有 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 编辑 ]

friendchj 发表于 2009-11-17 05:53

可以直接用组合命令产生,help nchoosek
如:
a=nchoosek(1:10,3);
b=a(randperm(nchoosek(10,3)),:);

rocwoods 发表于 2009-11-17 16:10

试试下面代码:

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]
查看完整版本: 如何产生以下要求的随机整数?(效率要尽量快,最好能矢量化)