在MATLAB上创建0-9的随机数字序列

-1 random matlab numbers

我需要创建几个包含从0到9的所有数字的随机序列.序列需要是随机的,不需要重复,需要包含0和9.我需要使用MATLAB来完成.

请帮忙!

ray*_*ica 7

使用randperm为你做到这一点.指定的输入数N(在你的例子像10),并且它返回大小的矢量N从随机放置元件1到N,使得其执行选择而不更换(又名置换).因此,在MATLAB中执行此操作:

rng(123); %// Set seed for reproducibility - 
          %// Not required... doing it so you can repeat my results
out = randperm(10) - 1;
Run Code Online (Sandbox Code Playgroud)

这就是我得到的:

out =

 2     1     9     5     8     3     7     0     4     6
Run Code Online (Sandbox Code Playgroud)

请注意,我必须从输出中减去 1.究其原因,就是因为randperm从生成向量1来N,当你想从价值观去0到N-1.


如果要创建多个随机序列,请创建一个矩阵,其中行数与所需的序列数一样长,列数与单个序列中所需的数量一样长(我们的10个)案件).之后,运行for循环以生成每个序列并将其存储到矩阵中的单独行中.

您也可以使用arrayfun,然后使用转换结果cell2mat.这是必需的,因为每次运行时arrayfun都会输出一cell组结果randperm,因此我们需要将所有这些单个单元格数组转换回单个矩阵.此外,这些序列将位于单行列的单元阵列中,因此我们需要在转换之前对其进行转置cell2mat.换句话说,尝试这样做:

rng(123);
numSequences = 5; %// Choose how many sequences you want here
out = arrayfun(@(x) randperm(10) - 1, 1:numSequences, 'uni', 0);
out = cell2mat(out.');
Run Code Online (Sandbox Code Playgroud)

我这样得到:

out = 

 2     1     9     5     8     3     7     0     4     6
 3     7     6     0     4     2     8     9     1     5
 7     8     5     6     3     9     0     4     2     1
 0     5     4     6     2     1     3     9     7     8
 1     5     2     3     6     8     9     0     4     7
Run Code Online (Sandbox Code Playgroud)

编辑

你想从0 - 9生成10个随机数,但只从这个随机生成的集合中选择一个子集(如5).如果你看一下randperm,你可以指定第二个参数,告诉它你最终要选择多少个数字.如果省略此参数,则默认为您指定的第一个参数N.因此,只需更改代码即可包含此附加参数.因此:

rng(123);
numSequences = 5; %// Choose how many sequences you want here
maxNumber = 10; %// Specify how many numbers to possibly generate from
subsetNumber = 5; %// How many numbers you want to select from the list of numbers
out = arrayfun(@(x) randperm(maxNumber, subsetNumber) - 1, 1:numSequences, 'uni', 0);
out = cell2mat(out.');
Run Code Online (Sandbox Code Playgroud)

以上说我想从中生成数字[0,9],但只从该列表中选择5个数字.因此,我得到以下输出:

out =

 1     9     8     2     5
 4     0     7     1     3
 6     3     1     7     5
 3     0     9     5     1
 5     1     2     8     6
Run Code Online (Sandbox Code Playgroud)

for 循环方法

如果你更像是MATLAB的初学者,你可以for像我之前所说的那样循环. Jon Skeet,他的一篇帖子中的StackOverflow忍者建议您先编写可读性代码,然后再进行优化(如果可以的话).我同意这一点,for循环方法肯定更具可读性.它基本上产生了arrayfun与cellmat正在做的事情.因此,你会for像这样循环方式:

rng(123);
numSequences = 5; %// Choose how many sequences you want here
maxNumber = 10; %// Specify how many numbers to possibly generate from
subsetNumber = 5; %// How many numbers you want to select from the list of numbers
out = zeros(numSequences, subsetNumber); %// Pre-allocate a numSequences x 10 matrix of zeroes
for idx = 1 : numSequences
    out(idx,:) = randperm(maxNumber, subsetNumber) - 1;
end
Run Code Online (Sandbox Code Playgroud)

你将得到与我上面给你看到的第一种方法相同的结果,所以我在此不再重复.


请注意,每行有一个随机序列.要访问第i 个序列,只需执行以下操作:

out(idx,:)
Run Code Online (Sandbox Code Playgroud)

idx将是您要访问的行.这将返回与您想要的行对应的随机排列.