Matlab中的几个随机函数-randperm,sort,rand,randint

本文介绍了Matlab中生成无重复随机数的方法,利用randperm函数实现1到n的整数随机排列,并对比了rand和randint等随机数生成函数的特点及用法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Matlab自带函数randperm(n)产生1到n的整数的无重复的随机排列,利用它就可以得到无重复的随机数。

function p = randperm(n);

%RANDPERM Random permutation.

% RANDPERM(n) is a random permutation of the integers from 1 to n.

% For example, RANDPERM(6) might be [2 4 5 6 1 3].

%

% Note that RANDPERM calls RAND and therefore changes RAND's state. %

% See also PERMUTE. % Copyright 1984-2002 The MathWorks, Inc.

% $Revision: 5.10 $ $Date: 2002/04/09 00:26:14 $

[ignore,p] = sort(rand(1,n));
 

原理:

1. rand(1, n)产生1行n列的0-1之内的随机数矩阵。

2. sort()把这个矩阵排序,返回的ignore是排序后的序列,p是排序后的序列的各数原来的索引,这个索引肯定是随机的,而且是在1到n间无重复的整数。

附:《Matlab中的几个随机函数》

rand

rand(n):生成0到1之间的n阶随机数方阵

rand(m,n):生成0到1之间的m×n的随机数矩阵

randint

randint(m,n,[1 N]):生成m×n的在1到N之间的随机整数矩阵,其效果与randint(m,n,N+1)相同。

>> randint(3,4,[1 10])

ans =

             10
              7
              6
>> randint(3,4,11)

ans =

    10           9
       10        9
    10           6

randperm

randperm(n):产生一个1到n的随机顺序。
>> randperm(10)

ans =

                         10        1

tic; clc; clear; % 读取 Excel 文件数据 data = xlsread('C:\Users\86198\Desktop\weizhi.xlsx'); % 检查数据是否有效 if isempty(data) || mod(size(data, 2), 2) ~= 0 error('Excel 数据为空或格式不正确,每一行应包含 (x, y) 坐标'); end % 提取 x, y 坐标 x = data(:, 1:2:end); % x 坐标(每行第 1,3,5,... 列) y = data(:, 2:2:end); % y 坐标(每行第 2,4,6,... 列) % 将数据展平成一列 x = x(:); y = y(:); % 组合坐标数据 sj = [x y]; num_points = size(sj, 1); % 获取点的数量 % 设定起点 d1 = [70, 40]; % 在数据起点和终点添加 d1 sj0 = [d1; sj; d1]; % 坐标转换为弧度 sj = sj0 * pi / 180; % 初始化距离矩阵 L = num_points + 2; % 总共 100 + 2 个点(包含起点和终点) d = zeros(L); % 计算球面距离矩阵 for i = 1:L-1 for j = i+1:L temp = cos(sj(i, 1) - sj(j, 1)) * cos(sj(i, 2)) * cos(sj(j, 2)) + sin(sj(i, 2)) * sin(sj(j, 2)); d(i, j) = 6370 * acos(temp); % 地球半径 6370 km end end d = d + d'; % 使矩阵对称 % 遗传算法参数 w = 50; % 种群规模 dai = 100; % 进化代数 % 生成初始种群 J J = zeros(w, L); for k = 1:w c = randperm(num_points); % 随机排列 100 个点 c1 = [1, c + 1, L]; % 加入起点和终点 flag = 1; % 2-opt 局部优化 while flag > 0 flag = 0; for m = 1:L-3 for n = m+2:L-1 if d(c1(m), c1(n)) + d(c1(m+1), c1(n+1)) < d(c1(m), c1(m+1)) + d(c1(n), c1(n+1)) flag = 1; c1(m+1:n) = c1(n:-1:m+1); end end end end J(k, :) = c1; end % 确保 J 只包含 1 到 L 之间的整数 J = round(J); % 设定起点和终点 J(:, 1) = 1; J(:, L) = L; % 初始化随机种子 rand('state', sum(clock)); % 遗传算法进化 A = J; for k = 1:dai % 交叉操作 B = A; c = randperm(w); % 随机选择个体 for i = 1:2:w F = 2 + floor(num_points * rand(1)); temp = B(c(i), F:L); B(c(i), F:L) = B(c(i + 1), F:L); B(c(i + 1), F:L) = temp; end % 变异操作 C = A; by = find(rand(1, w) < 0.1); % 10% 概率发生变异 if isempty(by) by = floor(w * rand(1)) + 1; end C = A(by, :); L3 = length(by); for j = 1:L3 bw = 2 + floor(num_points * rand(1,3)); bw = sort(bw); C(j, :) = C(j, [1:bw(1)-1, bw(2)+1:bw(3), bw(1):bw(2), bw(3)+1:L]); end % 合并父代与子代 G = [A; B; C]; TL = size(G, 1); % 确保 G 只包含 1 到 L 之间的整数 G = round(G); if any(G(:) < 1) || any(G(:) > L) || any(mod(G(:), 1) ~= 0) error('G 中包含无效索引,请检查遗传算法路径'); end % 计算路径长度 temp = zeros(TL, 1); for j = 1:TL for i = 1:L-1 temp(j) = temp(j) + d(G(j, i), G(j, i + 1)); end end % 选择最优个体 [DZ, IZ] = sort(temp); A = G(IZ(1:w), :); end % 最优路径及其长度 path = A(1, :); long = DZ(1); % 可视化路径 xx = sj0(path, 1); yy = sj0(path, 2); plot(xx, yy, '-o'); xlabel('经度'); ylabel('纬度'); title('最优路径'); grid on; % 显示最优路径长度 disp(['最短路径长度: ', num2str(long)]); toc;将以上Matlab代码改为python中运行
最新发布
03-20
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值