我只想使用“ 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。希望有人可以帮助我改善这一点
答案 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