MATLAB randsample以函数形式

时间:2016-01-22 07:29:28

标签: matlab function random-sample

目标是生成六个乐透号码,但显然它们必须是唯一的。这必须以函数形式编写,以下是使用库的等价物:

    (randsample(42,6))' 

我的想法是创建具有所有可能性的向量,通过索引一次选择一个向量,并且在下一个被挑选之前抓住它再次无法再选择它。

    function numbers = lottonumbers()

    pool = 1:42;
    numbers = zeros(1,6); 

    for i=1:6
        for j=42-i

            randIndex = round(1+j*rand);
            randNumber = pool(randIndex);
            numbers(i) = randNumber;

            if randIndex==1
                pool = pool(2:end);
            else if randIndex==length(pool)
                pool = pool(1:(end-1));
            else  
                pool = [pool(1:randIndex-1), pool(randIndex+1:end)];
                 end
            end
        end   
     end

因为我在MATLAB上非常棒(在编程时只是菜鸟)而且因为我在问这个问题时自己解决了这个问题,所以我只想把它留在这里并向你们寻求建议(更好)风格,其他算法...)

2 个答案:

答案 0 :(得分:1)

乐透是基于订单不起作用的排列。

% p = randperm(n,k) returns a row vector containing k unique integers selected randomly from 1 to n inclusive.
randperm( 42, 6 )

应该这样做。

从代码中:“这有时被称为1:N的K-置换或无需替换的抽样。”

答案 1 :(得分:0)

另一种方法是使用rejection sampling:独立生成数字,如果它们不是全部不同,则重新开始。只要数字不完全不同的机会很小,这就是有效的。

N = 6;
M = 42;
done = false;
while ~done
    result = randi(M,1,N); %// generate N numbers from [1,...,M]
    done = all(diff(sort(result))); %// if all are different, we're done
end