m個の要素の配列、ランダムにn個の重複しない要素を選択する(js実装)


問題の説明:

  m    source   ,    n            target

注意:source配列要素自体は重複しません.m>n

ソリューション


シナリオ1:
  • 配列sourceに従って、0からsourceに至る.length-1の範囲内でランダムな数を下付きとし、下付き対応要素を選択して配列target
  • に入れる
  • 同じ方法で、source配列から1つの数をランダムにし、この数をtarget配列に既存の数と比較し、異なる場合は入れ、同じ場合は
  • をランダムにする.
  • は2を繰り返し実行し、n個の異なる数をフィルタリングすることができる.

  • シナリオ2:
  • 配列sourceに従って、0からsourceに至る.length-1の範囲内でランダムに1つの数を下付きとし、下付きを選択して配列target
  • に入れる.
  • 同1法、ランダムに1つの新しい下標、この数をtarget配列の中で既存の数と比較して、異なっていれば入れて、同じなら更にランダムに
  • は2を繰り返し実行し、n個の異なる数をフィルタリングすることができる.
  • このとき配列targetはすべて選択する数の下付き文字を格納しており、下付き文字から対応するsource配列の数に変換すれば
  • である.
    シナリオ1とシナリオ2の違い:
    私たちは普段案を使うことが多いかもしれません.直感的だからです.しかし、分析によると、案2はもっと良いことが明らかになりました.理由:シナリオ1は実際のデータを比較し、シナリオ2は下付きで比較されるため、シナリオ2は比較記憶時に効率が高く、記憶に占めるメモリが小さい.

    シナリオ2 JavaScriptコード

        /**
         *  source 10   
         *    4      target
         *  
         */
        (function(){
            var source= [
                "c","c++","php","html","css","javascript","java","jsp","asp","node"
            ];
            var sL = source.length;
    
            var target= [];     //    
    
            //  4     
            for(var i = 0; i < 4; i++){
                var rand = Math.floor( Math.random() * sL );
                if(target.length > 0){
                    detection(target, rand);
                }else{
                    target.push(rand);
                }
            }
            //  num     arr,      ,       
            function detection(arr, num){
                var repeatFlag = false;
                for(var j = 0; j < arr.length; j++){
                    if(arr[j] == num){
                        repeatFlag = true;
                    }
                }
                if(repeatFlag){
                    //  
                    arguments.callee(arr, Math.floor( Math.random() * sL ));
                }else{
                    arr.push(num);
                }
            }
    
            //  ,  target
            //for(var i=0; i
            //  console.log(source[target[i]]);
            //}
        })(); 
    

    コメントのコードは、テストのコードです.
    私も半日最適化してやっと考え出した方法で、とても(∩∩)、簡単な問題は絶えず優から解決して、私たちはもっと進歩します.