仅使用“ randi”和一些循环产生6个不同的数字

时间:2019-03-12 06:37:24

标签: matlab

我只想使用“ randi”这个函数在matlab中随机产生6个不同的数字,这6个数字的范围是1〜12。

number=randi([1,12],1,6)
c=0;
        for n=1:6%when "n" is 1 to 6
            while c <= 6  %while c is less equal than 6,do the program below  
                  c = c + 1; %c=c+1
                  if number(n) == number(c) %when the nth element is equal to cth element
                     number(n) = randi(12); %produce a random integer in the nth element
                     c = 0; %the reason why i set c=0 again is because i want to check again whether  the new random integer is the same as cth element or not
                  end
            end
        end   
final_number=number

但是结果仍然让我喜欢

1“ 2” 6 11“ 2” 3

5“ 8”“ 8” 12 3 1

我该如何改进代码以产生6个不同的数字。我不想一直过多地依赖于方便的matlab指令,因此我的标签也会写c。希望有人可以帮助我改善这一点

2 个答案:

答案 0 :(得分:1)

既然您要重新选择一个随机数,那么当一个随机数出现多次时,为什么不立即一次重新选择所有数字呢?

df <- as.data.frame(df)
df[-1] <- t(apply(df[-1], 1, function(x) sort(x, decreasing = T)))
df
#  ID v1 v2 v3
#1  a  2  1  0
#2  b  3  2  0
#3  c  6  1  1
#4  d  3  2  1
#5  e  4  3  0
#6  f  5  5  2

自从您撰写之后,您特别想使用% Initial selecting of random numbers. number = randi([1, 12], 1, 6) % While the amount of unique elements in numbers is less than 6: while (numel(unique(number)) < 6) % Re-select random numbers. number = randi([1, 12], 1, 6) end 方法,我想是有原因的,您不想使用randi!?

答案 1 :(得分:1)

如果您想重现randsample(或randperm),为什么不重现MATLAB使用的算法呢? (据我们所知...)

这是Fisher-Yates shuffle。如果您有向量v,则每次迭代都会选择一个随机的,以前未使用的元素,并将其放在未选择的元素的末尾。如果执行k迭代,则列表的最后k个元素是您的随机样本。如果k等于v中的元素数,则说明您已经对整个数组进行了混洗。

function sample = fisher_yates_sample(v, k)
   % Select k random elements without replacement from vector v
   % if k == numel(v), this is simply a fisher-yates shuffle
   for n = 0:k-1
      randnum = randi(numel(v)-n);   % choose from unused values
      % swap elements v(end-n) and v(randnum)
      v([end-n, randnum]) = v([randnum, end-n]);
   end
   sample = v(end-k+1:end);
end

与MATLAB的版本不同,我的需要输入向量,因此要获得1:12范围内的6个随机值,您将像这样调用函数:

>> fisher_yates_sample(1:12,6)
ans =

    5   11    6   10    8    4