我需要创建几个包含从0到9的所有数字的随机序列。序列需要是随机的,不需要重复,需要包含0和9.我需要使用MATLAB来完成。
请帮忙!
答案 0 :(得分: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;
这就是我得到的:
out =
2 1 9 5 8 3 7 0 4 6
请注意,我必须从输出中减去 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.');
我因此得到:
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
您希望从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.');
以上说我想从[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
for
循环方法如果你更像是MATLAB的初学者,你可以像我之前所说的那样以for
循环的方式做到这一点。 Jon Skeet,他的一篇文章recommends that you write code for readability first, then optimize after (if you can)中的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
您将获得与我上面展示的第一种方法相同的结果,因此我不会在此重复。
注意我们每行有一个随机序列。要访问i th 序列,只需执行以下操作:
out(idx,:)
idx
将是您要访问的行。这将返回与您想要的行对应的随机排列。
答案 1 :(得分:3)
Rayryeng's answer是要走的路,并提供一些很好的解释。
如果您需要一次生成多个序列,以下代码(这是randperm
代码的概括)可能会更快:
M = 9; %// maximum value. Values from 0 to M will be generated
N = 5; %// number of random sequences you want to generate
[~, result] = sort(rand(N,M+1),2); %// generalization of randperm to several rows
result = result - 1; %// subtract 1 to match desired range
示例结果:
result =
6 8 3 9 7 4 0 2 5 1
3 4 9 6 2 8 1 7 0 5
3 5 8 0 1 6 9 2 7 4
8 3 5 0 9 7 2 4 1 6
0 7 3 6 1 5 9 8 4 2
答案 2 :(得分:0)
您是否希望生成10个项目的排列?在这种情况下,perms
函数会很有用。请参考: