在Matlab中使用rand()的随机数

时间:2018-08-07 03:00:50

标签: matlab matrix

我正在使用Matlab函数round(rand(256))创建大小为256x256,随机分布为0和1s的方阵。

我特别想做的是,我想以某种方式指定rand()(或与此相关的任何其他相关函数)生成的1的个数,以随机生成并分布在整个矩阵中

3 个答案:

答案 0 :(得分:3)

Magdrop’s answer是最简单的方法,它计算随机值的百分位数以确定阈值。

另外两个选项涉及randperm

  1. 将所有索引随机排列到矩阵中,然后阈值:

    sz = [256,256]; % matrix size
    n = 256; % number of zeros
    M = randperm(prod(sz)) <= n;
    M = reshape(M,sz);
    
  2. 随机置换索引,然后选择n作为索引的位置:

    indx = randperm(prod(sz),n);
    M = zeros(sz);
    M(indx) = 1;
    

答案 1 :(得分:1)

您也可以按通常方式生成随机值,但是在对它们进行四舍五入之前,请将它们作为向量进行排序。 1的数目将在您要剪切1或0的排序向量中的索引。例如,假设我们要50个1:

matrix = rand(256,256);
vec = sort(reshape(matrix,[],1));
thresh = vec(50);
matrix(matrix <= thresh) = 1;
matrix(matrix > thresh) = 0; 

答案 2 :(得分:0)

您可以使用randi函数来确定将其插入的位置,然后将其放入矩阵中。例如n个:

matrix = zeros(256,256);
onesIndices = randi([0 256*256],1,n);
matrix(onesIndices) = 1;

此方法的一个问题是randi可以生成重复值,尽管在此示例中,矩阵的大小很大而1的个数很低,这几乎是不可能的。您可以测试是否是这种情况,然后“重新滚动:”,因此如果sum(sum(matrix))小于n,您就知道您有重复值。

编辑:一种更好的方法是使用randperm而不是randi并仅使用前n个元素。这样可以避免重复和重新滚动。