我需要生成范围为1到n的m个唯一随机数。目前我实施的是:
round(rand(1,m)*(n-1)+1)
但是,阵列中会重复一些数字。我怎样才能获得唯一的数字?
答案 0 :(得分:13)
您可以使用randperm
。
来自说明:
p = randperm(n,k)
返回包含k个唯一整数的行向量 从1到n随机选择。
因此,randperm(6,3)
可能是载体
[4 2 5]
randperm的两个参数版本仅出现在R2011b中,因此如果您使用的是早期版本的MATLAB,那么您将看到该错误。在这种情况下,请使用:
A = randperm(n);
A = A(1:m);
答案 1 :(得分:5)
如上所述,在早于R2011b randperm
的Matlab版本中,只接受一个输入参数。在这种情况下,假设您拥有统计工具块,最简单的方法是使用randsample
:
randsample(n,m)
答案 2 :(得分:4)
@Stewie描述的randperm
方法似乎是大多数情况下的方法。但是,如果您只能使用带有1个输入参数的Matlab并且n
非常大,那么对所有数字使用randperm
并选择前几个可能是不可行的。在这种情况下,您可以执行以下操作:
n
n-1
之间的整数,这是可用整数中的选择。m
个数字这可以通过randi
完成,甚至可以通过在每一步绘制大量随机数来进行矢量化,直到唯一数量正确。
答案 3 :(得分:1)
使用MATLAB文件交换中的Shuffle。
Index = Shuffle(n, 'index', m);
答案 4 :(得分:-1)
这可以通过对浮动的随机向量进行排序来完成:
[i,i]=sort(rand(1,range));
output=i(1:m);