【发布时间】:2016-09-28 20:12:59
【问题描述】:
我需要在 1 到 n 范围内生成 m 个唯一的随机数。目前我已经实现的是:
round(rand(1,m)*(n-1)+1)
但是,有些数字在数组中是重复的。我怎样才能只获得唯一的数字?
【问题讨论】:
我需要在 1 到 n 范围内生成 m 个唯一的随机数。目前我已经实现的是:
round(rand(1,m)*(n-1)+1)
但是,有些数字在数组中是重复的。我怎样才能只获得唯一的数字?
【问题讨论】:
您可以使用randperm。
来自描述:
p = randperm(n,k)返回一个包含 k 个唯一整数的行向量 从 1 到 n 随机选择。
因此,randperm(6,3)
可能是向量
[4 2 5]
randperm 的两个参数版本仅出现在 R2011b 中,因此如果您使用的是早期版本的 MATLAB,那么您会看到该错误。在这种情况下,请使用:
A = randperm(n);
A = A(1:m);
【讨论】:
如上所述,在 R2011b 之前的 Matlab 版本中,randperm 只接受一个输入参数。在这种情况下,假设您拥有 Statistics Toolbx,最简单的方法是使用 randsample:
randsample(n,m)
【讨论】:
@Stewie 描述的randperm 方法似乎在大多数情况下是可行的方法。但是,如果您只能使用带有 1 个输入参数的 Matlab 并且 n 非常大,那么在所有数字上使用 randperm 并选择前几个可能不可行。在这种情况下,您可以执行以下操作:
n 之间的整数
n-1 之间的整数,这是可用整数中的选择。m 号码这可以通过randi 完成,甚至可以通过在每个步骤中绘制大量随机数来进行矢量化,直到唯一数量正确为止。
【讨论】:
n = 1e11 的 pre-2011b 解决方案,因此我认为这仍然增加了一些东西。
使用Shuffle,来自 MATLAB File Exchange。
Index = Shuffle(n, 'index', m);
【讨论】:
这可以通过对浮点数的随机向量进行排序来完成:
[i,i]=sort(rand(1,range));
output=i(1:m);
【讨论】: