用Matlab实现随机区间的划分
2006-02-25 13:49
267 查看
[问题描述]:
随机区间的划分,有兴趣可以考虑一下问题:
将长度位len的区间划分成n段,每一段的长度是0~m的一个随机值.(len,n,m是给定的值,并n*m>len).
或者可以描述为:
产生一个数列使其满足一下要求(len,n,m是给定的值,并n*m>len):
1、数列有n项;
2、数列的每一项使0~m的一个随机值;
3、此数列的各项之和是len;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%matlab解决方案
%我用matlab便的程序,请高手点评
%将长度为len的区间随机分成n块,最大块不超过m(n×m>len)
%算法描述:
%1、先产生前n-1项a1、a2、a3、...、a(n-1),每一项为0~m的随机数;
%2、下面确定最后一项:
% (1)令last = len - sum(n-1);sum(n-1)表示前n-1项的和
% (2)测试last的值;
% (3)如果last满足:last>0 且 last<m,则last就是最后一项,程序结束;
% (4)如果last<0,则从前n-1项中随机挑取一项,假设是第k项,
% 从中取出0~ak的随机数s,让last = last + s,
% (5)如果last>m,则从前n-1项中随机选取一项ak,从last取出0~(m-ak)的随机数s,
% last = last - s;
% (6)重复第(2)步;
function f = rand_seq(len,n,m)
f = m*rand(1,n) %产生1行n列的随机矩阵,每项不超过m
s = len - (sum(f) - f(n)); %最后剩余s
count = 0;
index = 0;
r = 0;
while s - m > 1e-18 || s < 1e-18
while s < 1e-18
index = int16(rand*(n-1) + 1);
t = f(index); %取第i项的值
r = rand;
f(index) = t*r; %从第i项中拿出t*(1-r)加到s里
s = s + t*(1-r);
count = count + 1;
end
while s - m > 1e-18
index = int16(rand*(n-1) + 1);
t = f(index); %取第i项的值
r = rand;
f(index) = t + (m-t)*r; %向第i项中加(m-t)*r
s = s - (m - t)*r;
count = count + 1;
end
end
f(n) = s; %最后一项确定
count %输出循环次数
随机区间的划分,有兴趣可以考虑一下问题:
将长度位len的区间划分成n段,每一段的长度是0~m的一个随机值.(len,n,m是给定的值,并n*m>len).
或者可以描述为:
产生一个数列使其满足一下要求(len,n,m是给定的值,并n*m>len):
1、数列有n项;
2、数列的每一项使0~m的一个随机值;
3、此数列的各项之和是len;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%matlab解决方案
%我用matlab便的程序,请高手点评
%将长度为len的区间随机分成n块,最大块不超过m(n×m>len)
%算法描述:
%1、先产生前n-1项a1、a2、a3、...、a(n-1),每一项为0~m的随机数;
%2、下面确定最后一项:
% (1)令last = len - sum(n-1);sum(n-1)表示前n-1项的和
% (2)测试last的值;
% (3)如果last满足:last>0 且 last<m,则last就是最后一项,程序结束;
% (4)如果last<0,则从前n-1项中随机挑取一项,假设是第k项,
% 从中取出0~ak的随机数s,让last = last + s,
% (5)如果last>m,则从前n-1项中随机选取一项ak,从last取出0~(m-ak)的随机数s,
% last = last - s;
% (6)重复第(2)步;
function f = rand_seq(len,n,m)
f = m*rand(1,n) %产生1行n列的随机矩阵,每项不超过m
s = len - (sum(f) - f(n)); %最后剩余s
count = 0;
index = 0;
r = 0;
while s - m > 1e-18 || s < 1e-18
while s < 1e-18
index = int16(rand*(n-1) + 1);
t = f(index); %取第i项的值
r = rand;
f(index) = t*r; %从第i项中拿出t*(1-r)加到s里
s = s + t*(1-r);
count = count + 1;
end
while s - m > 1e-18
index = int16(rand*(n-1) + 1);
t = f(index); %取第i项的值
r = rand;
f(index) = t + (m-t)*r; %向第i项中加(m-t)*r
s = s - (m - t)*r;
count = count + 1;
end
end
f(n) = s; %最后一项确定
count %输出循环次数
相关文章推荐
- 用Matlab实现随机区间的划分
- SQL Server中的RAND函数的介绍和区间随机数值函数的实现
- 详解快速排序算法中的区间划分法及Java实现示例
- 基于随机游走的社团划分算法hadoop MR实现
- SQL Server中的RAND函数的介绍和区间随机数值函数的实现
- SQL Server中的RAND函数的介绍和区间随机数值函数的实现
- 用MATLAB实现1到10000的数组,随机从中抽取8000个元素
- 快速排序算法的实现 && 随机生成区间里的数 && O(n)找第k小 && O(nlogk)找前k大
- [Matlab]随机漫步Random Walk和奇异期权的Matlab实现
- 基于随机游走的社团划分算法label progation 的python实现
- 基于随机游走的社团划分算法label progation 的python实现
- 用matlab实现的教师-考场随机分配
- [MSSQL]SQL Server中的RAND函数的介绍和区间随机数值函数的实现
- 基于随机游走的社团划分算法label progation 的python实现
- 实现xml文件随机划分的python脚本
- 产生随机值脉冲噪声的matlab算法实现
- 图像拉普拉斯金字塔(laplacian pyramid)并从金字塔重建原图 matlab程序实现
- 写写Matlab的Turbo仿真实现吧
- Problem 60: Intervals(划分区间问题)
- 1.编程实现基本遗传算法:对函数f(x) =x2,求其自变量x在区间[0,31] 取整数值时的最大值