在matlab中使用rand()实现随机数

在matlab中使用rand()实现随机数,matlab,matrix,Matlab,Matrix,我正在使用Matlab函数round(rand(256))创建一个大小为256x256、随机分布为0和1的方阵 我特别想做的是,我想以某种方式指定rand()在整个矩阵中随机生成和分布的1数(或任何其他相关函数)您可以使用randi函数来确定插入1的位置,然后把这些放进你的矩阵。例如,对于n项: matrix = zeros(256,256); onesIndices = randi([0 256*256],1,n); matrix(onesIndices) = 1; 这种方法的一个问题是,r

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


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

您可以使用
randi
函数来确定插入1的位置,然后把这些放进你的矩阵。例如,对于
n
项:

matrix = zeros(256,256);
onesIndices = randi([0 256*256],1,n);
matrix(onesIndices) = 1;
这种方法的一个问题是,
randi
可以生成重复值,尽管在这个例子中,矩阵的大小很大,而矩阵的数量很少,这是不太可能的。您可以测试是否是这种情况,并“重新滚动:”因此,如果
sum(sum(matrix))
小于
n
您就知道有一个重复值


编辑:更好的方法是使用
randperm
而不是
randi
,并且只取第一个
n
元素。这应该可以防止重复和必须重新滚动

您可以使用
randi
函数来确定插入位置,然后将这些位置放入矩阵中。例如,对于
n
项:

matrix = zeros(256,256);
onesIndices = randi([0 256*256],1,n);
matrix(onesIndices) = 1;
这种方法的一个问题是,
randi
可以生成重复值,尽管在这个例子中,矩阵的大小很大,而矩阵的数量很少,这是不太可能的。您可以测试是否是这种情况,并“重新滚动:”因此,如果
sum(sum(matrix))
小于
n
您就知道有一个重复值


编辑:更好的方法是使用
randperm
而不是
randi
,并且只取第一个
n
元素。这应该可以防止重复和必须重新滚动

您也可以用通常的方法生成随机值,但在对它们进行取整之前,请将它们作为向量进行排序。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; 
matrix=rand(256256);
vec=排序(重塑(矩阵,[],1));
thresh=vec(50);
矩阵(矩阵阈值)=0;

您也可以用常规方法生成随机值,但在对其进行四舍五入之前,请将其作为向量进行排序。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; 
matrix=rand(256256);
vec=排序(重塑(矩阵,[],1));
thresh=vec(50);
矩阵(矩阵阈值)=0;
是最直接的方法,它计算随机值的百分位来确定阈值

另外两个选择涉及:

  • 将所有索引随机排列到矩阵中,然后选择阈值:

    sz = [256,256]; % matrix size
    n = 256; % number of zeros
    M = randperm(prod(sz)) <= n;
    M = reshape(M,sz);
    
  • 是最直接的方法,它计算随机值的百分位来确定阈值

    另外两个选择涉及:

  • 将所有索引随机排列到矩阵中,然后选择阈值:

    sz = [256,256]; % matrix size
    n = 256; % number of zeros
    M = randperm(prod(sz)) <= n;
    M = reshape(M,sz);
    

  • 您的意思是,对于较小的
    n
    (w.r.t.矩阵的大小),这种可能性较小。通常,重复的值很有可能出现。要生成50%的矩阵,使用这种方法可以滚动很多个。嗯,我的意思是,如果矩阵的大小与所需的矩阵的数量相比是大的。我会更新的,谢谢。谢谢大家的回答。Cris Luengo您的逻辑工作完美无瑕。您的意思是,对于较小的
    n
    (w.r.t.矩阵大小)来说,这种可能性较小。通常,重复的值很有可能出现。要生成50%的矩阵,使用这种方法可以滚动很多个。嗯,我的意思是,如果矩阵的大小与所需的矩阵的数量相比是大的。我会更新的,谢谢。谢谢大家的回答。Cris Luengo你的逻辑完美无瑕。