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

时间:2014-08-10 15:51:06

标签: matlab random numbers

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

请帮忙!

3 个答案:

答案 0 :(得分:7)

使用randperm为您执行此操作。您指定了一个输入数字N(在您的示例中为10),它会返回从N1的随机放置元素的大小为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生成了从1N的向量,而您希望值从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循环方法肯定更具可读性。它主要产生arrayfuncellmat结合的内容。因此,您可以按照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函数会很有用。请参考:

http://www.mathworks.com/help/matlab/ref/perms.html