声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 1329|回复: 2

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

[复制链接]
发表于 2009-11-16 22:13 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

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

问题的简单描述:
如有 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 编辑 ]
回复
分享到:

使用道具 举报

发表于 2009-11-17 05:53 | 显示全部楼层
可以直接用组合命令产生,help nchoosek
如:
a=nchoosek(1:10,3);
b=a(randperm(nchoosek(10,3)),:);

评分

1

查看全部评分

发表于 2009-11-17 16:10 | 显示全部楼层
试试下面代码:

  1. function r=randnchoosek(n,k)
  2. ln=length(n);
  3. for i=1:k  
  4.     ind=i-1+unidrnd(ln-i+1);
  5.     a=n(ind);
  6.     n(ind)=n(i);
  7.     n(i)=a;
  8. end
  9. r=n(1:k);
复制代码

n越大,k越小,相对randperm越有优势

评分

1

查看全部评分

您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-5-16 03:50 , Processed in 0.093278 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表