x = bingo(25,1000,1);
rho = corr((1:size(x,2))',x(1:size(x,1),:)','type','Kendall');
figure(1); hist(rho,-1:0.1:1); axis([-1 1 0 300])
fprintf('Mean = %f, skewness = %f\n', mean(rho), skewness(rho));
function r = bingo(n,k,p)
% r = bingo(n,k) returns a k-by-n array, each row of which is a random
% permutation of 1:n, using random numbers with p significant digits .
[m r] = sort(randr([k n],p),2);
function r = randr(M,p)
r = floor(rand(M).*10^p)./10^p;
shg #2615() [ Matlab ] Rating1/1=1.00
#2264の指摘をみてなるほどと思ったので簡単なテスト。順位相関を使ってみた。
#2285のコード(MATLAB標準のrandpermも同じ方法)は最初に乱数を要求された数列の個数分だけ作り、その順序を返す。MATLABのsortは値が同じ場合は順序を保存するので、たとえば1番目と2番目の乱数が同じ数字だと必ず1が2の前になってしまう。
投稿のコードは乱数の有効桁数(最初の行の最後の引数)を制限し、生成した数列とその位置の順位相関の分布と平均を表示する。有効桁数を1にした場合はかなり偏りが生じるが、3桁くらいでほとんど偏りが無い。順位相関を見る限りでは、普通の精度の乱数を使えばこのアルゴリズムでの偏りを気にする必要は無さそう。
x = bingo(25,1000,1); rho = corr((1:size(x,2))',x(1:size(x,1),:)','type','Kendall'); figure(1); hist(rho,-1:0.1:1); axis([-1 1 0 300]) fprintf('Mean = %f, skewness = %f\n', mean(rho), skewness(rho)); function r = bingo(n,k,p) % r = bingo(n,k) returns a k-by-n array, each row of which is a random % permutation of 1:n, using random numbers with p significant digits . [m r] = sort(randr([k n],p),2); function r = randr(M,p) r = floor(rand(M).*10^p)./10^p;Rating1/1=1.00-0+