【问题标题】:How to generate unique random numbers in Matlab?Matlab如何生成唯一的随机数?
【发布时间】:2016-09-28 20:12:59
【问题描述】:

我需要在 1 到 n 范围内生成 m 个唯一的随机数。目前我已经实现的是:

round(rand(1,m)*(n-1)+1)

但是,有些数字在数组中是重复的。我怎样才能只获得唯一的数字?

【问题讨论】:

    标签: matlab unique


    【解决方案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);
    

    【讨论】:

      【解决方案2】:

      如上所述,在 R2011b 之前的 Matlab 版本中,randperm 只接受一个输入参数。在这种情况下,假设您拥有 Statistics Toolbx,最简单的方法是使用 randsample

      randsample(n,m)
      

      【讨论】:

        【解决方案3】:

        @Stewie 描述的randperm 方法似乎在大多数情况下是可行的方法。但是,如果您只能使用带有 1 个输入参数的 Matlab 并且 n 非常大,那么在所有数字上使用 randperm 并选择前几个可能不可行。在这种情况下,您可以执行以下操作:

        1. 生成一个介于 1 和 n 之间的整数
        2. 生成一个介于 1 和 n-1 之间的整数,这是可用整数中的选择。
        3. 重复直到有m 号码

        这可以通过randi 完成,甚至可以通过在每个步骤中绘制大量随机数来进行矢量化,直到唯一数量正确为止。

        【讨论】:

        • 这可行,但时间效率较低。原因是他必须编写代码来查找索引整数的值。
        • @George 效率较低是相对的。我还没有看到任何可以处理 n = 1e11 的 pre-2011b 解决方案,因此我认为这仍然增加了一些东西。
        • 当然可以,但我认为只实现最新版本的 randperm 会更有效。
        【解决方案4】:

        使用Shuffle,来自 MATLAB File Exchange。

        Index = Shuffle(n, 'index', m);
        

        【讨论】:

          【解决方案5】:

          这可以通过对浮点数的随机向量进行排序来完成:

          [i,i]=sort(rand(1,range));
          output=i(1:m);
          

          【讨论】:

            猜你喜欢
            • 2013-12-14
            • 1970-01-01
            • 2013-03-19
            • 2020-05-27
            • 1970-01-01
            • 1970-01-01
            • 2018-05-03
            相关资源
            最近更新 更多