N個の重複しない乱数を生産する(一つの配列からN個の要素をランダムに取る)
1010 ワード
長さMの配列からN個の要素をランダムに取りたいという要件がある.
2つの考えを考えます.
①重複しないN個の乱数(0からM-1までの間)を生成し、このN個の数を下付きの単位とする.
②この配列のすべてのセルを乱し、前のN個の値をとる.
第一に、単純にN個の乱数を生成するには、悪くない方法があります.http://blog.csdn.net/devfun/article/details/6534476
M個の数から取るので、長さMの補助空間(コードのstartArrayを0からM-1の配列に変更する)を借りる必要があります.
2番目の対の最初のN個の数は,それぞれランダムな1つの要素と交換される.PHPで簡単に実現しましたが、前のN個の元素を乱した後、前の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