N個の重複しない乱数を生産する(一つの配列からN個の要素をランダムに取る)

1010 ワード

長さMの配列からN個の要素をランダムに取りたいという要件がある.
2つの考えを考えます.
①重複しないN個の乱数(0からM-1までの間)を生成し、このN個の数を下付きの単位とする.
②この配列のすべてのセルを乱し、前のN個の値をとる.
第一に、単純にN個の乱数を生成するには、悪くない方法があります.http://blog.csdn.net/devfun/article/details/6534476
int startArray[] = {0,1,2,3,4,5,6,7,8,9};//seed array    
int N = 10;//         
int resultArray[] = new int [10];//           
for(int i = 0; i < N; i++)    
{    
    int seed = random(0, startArray.length - i);//              
    resultArray[i] = startArray[seed];//           
    startArray[seed] = startArray[startArray.length - i - 1];//                   。    
}

M個の数から取るので、長さMの補助空間(コードのstartArrayを0からM-1の配列に変更する)を借りる必要があります.
2番目の対の最初のN個の数は,それぞれランダムな1つの要素と交換される.PHPで簡単に実現しましたが、前のN個の元素を乱した後、前のN個の値を取ればいいです.
        public static function getRandomN($arr,$n){
                $len = count($arr);
                if($len<=$n){
                        return $arr;
                }
             
                for($i=0;$i