我想只使用“randi”这个函数在matlab中随机产生6个不同的数字,这6个数字的范围是1~12。
数=兰迪([1,12],1,6)C = 0; 对于n = 1:6%,当“n”是……
你在寻找什么 randperm 。它产生一系列整数的随机排列,因此如果你选择第一个整数 k 数字,你确定你得到了 k [1; n]范围内的唯一整数。
randperm
k
在您的情况下,只需致电:
randperm(12,6)
由于您重新选择单个随机数,当多次出现一个时,为什么不一次重新选择所有数字呢?
% 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 方法,我猜有一个原因,你不想用 randperm(12, 6) !?
randi
randperm(12, 6)
如果你想重现 randsample (要么 randperm ),为什么不重复MATLAB使用的算法? (据我们所知...)
randsample
这是 费雪耶茨洗牌 。如果你有一个向量 v ,每次迭代选择一个随机的,先前未使用的元素,并将其放在未选择元素的末尾。如果你这样做 k 迭代,最后 k 列表中的元素是随机样本。如果 k 等于中的元素数量 v ,你已经洗了整个阵列。
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的版本不同,我需要一个向量作为输入,因此要获得该范围内的6个随机值 1:12 你可以这样调用这个函数:
1:12
>> fisher_yates_sample(1:12,6) ans = 5 11 6 10 8 4