복붙노트

[JQUERY] 생성 된 JS에서 난수를 비 반복

JQUERY

생성 된 JS에서 난수를 비 반복

해결법


  1. 1.내가 바로 그때 이해한다면 당신은 단지 숫자 1 ~ 10의 순열 (반복없이 랜덤 화 즉, 숫자)를 찾고? 어쩌면 시작에 한 번, 그 숫자의 무작위 목록을 생성하려고, 그냥 그 길을 작업 후?

    내가 바로 그때 이해한다면 당신은 단지 숫자 1 ~ 10의 순열 (반복없이 랜덤 화 즉, 숫자)를 찾고? 어쩌면 시작에 한 번, 그 숫자의 무작위 목록을 생성하려고, 그냥 그 길을 작업 후?

    이 nums의 숫자의 임의의 순열을 계산합니다 :

    var nums = [1,2,3,4,5,6,7,8,9,10],
        ranNums = [],
        i = nums.length,
        j = 0;
    
    while (i--) {
        j = Math.floor(Math.random() * (i+1));
        ranNums.push(nums[j]);
        nums.splice(j,1);
    }
    

    따라서, 예를 들어, 경우 1 사이의 임의의 숫자를 찾고 있었다 -도했다 (20)도, 당신은 사용할 수 있습니다 :

    nums = [2,4,6,8,10,12,14,16,18,20];
    

    그럼 그냥 임의의 숫자를 기억하기 위해 ranNums을 읽어.

    이것은 당신이 당신의 접근 방식에서 발견 된대로 사용되지 않는 번호를 찾기 위해 점점 더 복용의 위험을 실행하지 않습니다.

    편집 :이를 읽고 jsperf에서 테스트를 실행 한 후,이 일을 훨씬 더 좋은 방법처럼 보인다 피셔 - 예이츠 셔플입니다 :

    function shuffle(array) {
        var i = array.length,
            j = 0,
            temp;
    
        while (i--) {
    
            j = Math.floor(Math.random() * (i+1));
    
            // swap randomly chosen element with current element
            temp = array[i];
            array[i] = array[j];
            array[j] = temp;
    
        }
    
        return array;
    }
    
    var ranNums = shuffle([1,2,3,4,5,6,7,8,9,10]);
    

    기본적으로, '비싼'배열 작업의 사용을 피함으로써 더 효율적입니다.

    보너스 편집 : 발전기를 사용하는 또 다른 가능성은 (당신이 지원을 가정)

    function* shuffle(array) {
    
        var i = array.length;
    
        while (i--) {
            yield array.splice(Math.floor(Math.random() * (i+1)), 1)[0];
        }
    
    }
    

    그런 다음 사용 :

    var ranNums = shuffle([1,2,3,4,5,6,7,8,9,10]);
    
    ranNums.next().value;    // first random number from array
    ranNums.next().value;    // second random number from array
    ranNums.next().value;    // etc.
    

    당신이 단행 배열의 모든 요소를 ​​통해 실행하고 나면 곳 ranNums.next (). 값은 결국 undefined로 평가합니다.

    당신은 여전히 ​​스플 라이스 - 보내고 배열이기 때문에 전체 이것은 피셔 - 예이츠 셔플 효율적으로되지 않습니다. 그러나 차이는 당신이 아니라 모든 선행 그것을하는 것보다 그것을 필요로 할 때 당신이 지금 이렇게 사용 사례에 따라 해당 작업을 수행하고 있다는 것입니다,이 더 좋을 수 있습니다.


  2. 2.

    let anArrayOfUniqueNumbers = [];
    
    let numberGenerator = function(arr) {
      if (arr.length >= 10) return;
      let newNumber = Math.floor(Math.random() * 10 + 1);
      if (arr.indexOf(newNumber) < 0) {
        arr.push(newNumber);
      }
      numberGenerator(arr);
    };
    
    numberGenerator(anArrayOfUniqueNumbers);
    

    왜냐하면 가드 절 (경우 (arr.length> = 10) 창)의 함수는 파라미터가 충족 된 후 실행을 중지한다.


  3. 3.

    //random number without repetition in JavaScript, Just in one line;
    //it can be used as _id;
    //it not need to store or check;
    

    CONST myRnId = () =>에서는 parseInt (Date.now () * 인 Math.random ()); CONSOLE.LOG (myRnId ()); // 어떤 임의의 숫자는 타임 스탬프를 포함;


  4. 4.문제는 당신이 포화 상태에 접근하면 "무작위"고유 번호를 생성하는 데 시간이 더 긴 걸릴하기 시작한다는 것입니다. 사용 된 숫자 배열이 잠재적 9 및 10 시간이 오래 걸릴 수 8 개 번호 찾을 수를 포함하면 예를 들어, 당신은 최대의 위에 제공된 예제에 10입니다. 최대 호출 스택 오류가 생성되는 곳은 아마입니다.

    문제는 당신이 포화 상태에 접근하면 "무작위"고유 번호를 생성하는 데 시간이 더 긴 걸릴하기 시작한다는 것입니다. 사용 된 숫자 배열이 잠재적 9 및 10 시간이 오래 걸릴 수 8 개 번호 찾을 수를 포함하면 예를 들어, 당신은 최대의 위에 제공된 예제에 10입니다. 최대 호출 스택 오류가 생성되는 곳은 아마입니다.

    jsFiddle 데모 끝나가 반복되는 횟수 도시


  5. 5.

    <!DOCTYPE html>
    <html>
    <body>
    
    <h2>JavaScript Math.random()</h2>
    
    <p>Math.random() returns a random number between 0 (included) and 1 (excluded):</p>
    
    <p id="demo"></p>
    
    <script>
    
    
    var storeArray = []
    
    function callRamdom(){
        var randomNumber = Math.floor(Math.random() * 5);   
        return randomNumber;
    }
    
    function randomStore(){ 
    
        var localValue = callRamdom()
        var status = false;
        for(i=0;i<5; i++){
        var aa = storeArray[i];
            if(aa!=localValue){
                console.log(storeArray[i]+"hhhhh"+ localValue); 
                if(i==4){
                    status=true;        
                }
    
            }   
            else
            break;
    
        }
    
        if(status==true){
    
            storeArray.push(localValue);    
        }
        if(storeArray.length!=5){
            randomStore();
        }   
    
        return storeArray;
    }
    
    
    
    document.getElementById("demo").innerHTML = randomStore();
    
    
    </script>
    
    </body>
    </html>
    

  6. 6.[= 도착하자; 하다 { 하자 NUM = Math.floor (인 Math.random () * 10 + 1); (NUM) arr.push; 도착 arr.filter = ((항목, 인덱스) => { 반환 arr.indexOf (항목) === 인덱스 }); } 동안 (arr.length <10); CONSOLE.LOG (도착);

    [= 도착하자; 하다 { 하자 NUM = Math.floor (인 Math.random () * 10 + 1); (NUM) arr.push; 도착 arr.filter = ((항목, 인덱스) => { 반환 arr.indexOf (항목) === 인덱스 }); } 동안 (arr.length <10); CONSOLE.LOG (도착);


  7. 7.

    function randomNumbers(max) {
        function range(upTo) {
            var result = [];
            for(var i = 0; i < upTo; i++) result.push(i);
            return result;
        }
        function shuffle(o){
            for(var j, x, i = o.length; i; j = Math.floor(Math.random() * i), x = o[--i], o[i] = o[j], o[j] = x);
            return o;
        }
        var myArr = shuffle(range(max));
        return function() {
            return myArr.shift();
        };
    }
    

    약간의 테스트를 내장, jsfiddle에 이것을 시도 :

    var randoms = randomNumbers(10),
        rand = randoms(),
        result = [];
    while(rand != null) {
        result.push(rand);
        rand = randoms();
    }
    console.log(result);
    

    dzone.com의 셔플 기능 의례.


  8. 8.이것은 내가 underscore.js를 사용하여 그것을 달성하는 방법이다

    이것은 내가 underscore.js를 사용하여 그것을 달성하는 방법이다

    최대 값으로 분에서 n은 정수를 얻을 수 있습니다. 여기서 n은 크기 인수입니다.

    var randomNonRepeatingIntFromInterval = function(min, max, size) {
        var values = [];
    
        while (values.length < size) {
          values.push(Math.floor(Math.random() * ( max - min + 1) + min));
    
          values = _.uniq(values);
        }
    
        return values;
      }
    

  9. 9.죄송합니다,이 오래된 질문에 새로운 해답이지만,이지도를보다 효율적으로 수행 할 수 있습니다. 무엇 후 당신은 무작위 선택보다는 무작위로 반복되지 않는 것입니다. 임의 비는-반복하는 것은 무의미하다.

    죄송합니다,이 오래된 질문에 새로운 해답이지만,이지도를보다 효율적으로 수행 할 수 있습니다. 무엇 후 당신은 무작위 선택보다는 무작위로 반복되지 않는 것입니다. 임의 비는-반복하는 것은 무의미하다.

    _a 컬렉션이며, r은 컬렉션의 일부가 아닌 경우, 우리는 임의의 값의 R을 람다 :

    function aRandom(f){
      var r = Math.random();
      aRandom._a[r] ? aRandom(f) : f(r,aRandom._a[r] = 1);
    }
    aRandom._a = {};
    
    //usage:
    aRandom(function(r){ console.log(r) });
    

    재정 aRandom._a 브라우저 부진 얻을 때. 결국 부진을 방지하기 위해, 하나는 정말 미분 가능성 강제 충분한 반복의 기회를 효과적으로 제로가되도록 엔트로피보다는 짐승에 너 한테 UUID 세대를 사용해야합니다. 나는 라틴어 접두사 A- 수단 때문에 함수 이름 aRandom 선택했다 "멀리합니다." 더는 사용 이후로, 임의의 출력에서 ​​더 멀리. 이 함수는 맥북에 2100 밀리 백만 고유 한 값을 생성합니다.

    위의 솔루션의 장점 집합을 제한 할 필요 없다. 뿐만 아니라, 여러 발신자가 동시에 사용하고 그 값이 다른 모든 발신자는 다른 가정 할 수있다. 중복이없는 경우를 보험에 가입하지이 노이즈 터링 분포와 같은 것들에 대한 편리합니다.

    그러나, 공급 길이 램 사용을 제한하기 때문에로,뿐만 아니라 정수를 반환하도록 수정 될 수있다 :

    function aRandom(f,c){
      var r = Math.floor(Math.random()*c);
      aRandom._a[r] ? aRandom(f,c) : f(r,aRandom._a[r] = 1);
    }
    aRandom._a = {};
    
    
    //usage:
    var len = 10;
    var resultset = [];
    for(var i =0; i< len; i++){
      aRandom(function(r){ resultset.push(r); }, len);
    }
    console.log(resultset);
    

  10. 10.randojs.com이 간단한 한 줄을합니다 :

    randojs.com이 간단한 한 줄을합니다 :

    randoSequence(1, 10)
    

    이는 임의의 순서로 (10)를 통해 하나의 번호의 배열을 반환한다. 당신은 당신의 HTML 문서의 머리에 다음을 추가해야합니다, 당신은 거의 쉽게 무작위로 원하는대로 할 수 있습니다. 배열에서 임의의 값, 임의 JQuery와 요소, 개체에서 임의의 특성, 심지어 방지 반복은 여기 보여준한다.

    <script src="https://randojs.com/1.0.0.js"></script>
    

  11. 11.참조 그냥 하나 개의 솔루션

    참조 그냥 하나 개의 솔루션

    const fiveNums = () => {
      const ranNum = () => Math.floor(Math.random() * (10 + 1));
      let current;
      let arr = [];
    
      while(arr.length < 5) {
        if(arr.indexOf(current = ranNum()) === -1) {
           arr.push(current);
        }
      }
      return arr;
    };
    
    fiveNums();
    

  12. 12.경우에는 순열 싶어하지 않습니다 및 / 또는 길이가 변수를한다, 여기에 비에 대한 해결책은 무작위 목록을 반복 / 배열이없는 경우 - 문 :

    경우에는 순열 싶어하지 않습니다 및 / 또는 길이가 변수를한다, 여기에 비에 대한 해결책은 무작위 목록을 반복 / 배열이없는 경우 - 문 :

    // old_key 경우에는 반복이 제공되지 않습니다 함수 myShuffle (arr_or_list가 old_key = 거짓) { VAR 키 = Array.from (Object.keys (arr_or_list)); // 추출 키 경우 (old_key! = 거짓) { keys.splice (keys.indexOf (old_key), 1); // 제거합니다 키에서 old_key }; VAR randomKey 키를 = Math.floor (인 Math.random () * keys.length)]; // 임의의 키를 얻을 randomKey를 반환; } //테스트: CONST A = [10, 20, 30, 40, 50, 60]; CONST B = { "A": 10, "즐 - 즐 ~ 즐 ~": 20, "D"30 "C": 40 }; VAR oldKeys_a = []; VAR oldKeys_b = []; oldKeys_a [0] = myShuffle (a); oldKeys_b [0] = myShuffle (b); var에 나는; 대해 (ⅰ = 1; 나는 <10; I ++) { oldKeys_a [I] = myShuffle (a, oldKeys_a [I - 1]); oldKeys_b [I] = myShuffle (b, oldKeys_b [I - 1]); } 경고 ( 'oldKeys_a :'+ oldKeys_a + '; oldKeys_b :'+ oldKeys_b) // 임의 ... // >>> oldKeys_a : 1,3,0,0,5,0,4,5,2,3; oldKeys_b : D, A, D, BLA BLA BLA-A, C, D, BLA BLA BLA-A, D <<<


  13. 13.

    while(randArr.length < SIZEOFARRAY){
      val = Math.floor((Math.random() * RANGEOFVALUES));
    
      if(randArr.indexOf(val) < 0){
        randArr.push(val);
      }
    }
    

    당신은 당신이 사용하고자하는 배열의 크기에 SIZEOF 배열을 변경할 수 있습니다 또한 당신이 랜덤 할 값의 범위에 값 범위를 변경


  14. 14.

    function Myrand(max,min){
        arr=[];
        for (i = 0; i < max; i++) {
            x = Math.floor( Math.random() * max) + min;
            if(arr.includes(x) == true){
                i=i-1;
            }else{
                if(x>max==false){
                    arr.push(x);
                }
            }
        }
        return arr;
    }
    console.log(Myrand(5,1));
    

  15. 15.HTML

    HTML

    <p id="array_number" style="font-size: 25px; text-align: center;"></p>
    

    JS

    var min = 1;
    var max = 90;
    var stop = 6;  //Number of numbers to extract
    
    var numbers = [];
    
    for (let i = 0; i < stop; i++) {
      var n =  Math.floor(Math.random() * max) + min;
      var check = numbers.includes(n);
    
    if(check === false) {
      numbers.push(n);
    } else {
      while(check === true){
        n = Math.floor(Math.random() * max) + min;
        check = numbers.includes(n);
          if(check === false){
            numbers.push(n);
          }
        }
      }
    }
    
    sort();
    
     //Sort the array in ascending order
     function sort() {
       numbers.sort(function(a, b){return a-b});
       document.getElementById("array_number").innerHTML = numbers.join(" - ");
    }
    

    데모


  16. 16.당신은 정말 임의의 숫자의 손실을 원하지 않는다. 참으로 임의의 숫자는 반복 할 수 있어야합니다.

    당신은 정말 임의의 숫자의 손실을 원하지 않는다. 참으로 임의의 숫자는 반복 할 수 있어야합니다.

    참 난수 주사위를 던지는 같다. 모든 번호가 그 다음에 올 수 있습니다.

    셔플 번호는 카드 놀이를 그리기 같다. 각 숫자는 한 번만 올 수 있습니다.

    당신이 정말 요구하는 것은 번호 목록을 셔플하는 것입니다 후 단행 목록에서 첫 번째 많은 숫자를 사용합니다.

    순서대로 번호 목록을 만들고, 다음 무작위로 그 목록의 사본에서 번호를 선택 난수 생성기를 사용하여 생각하십시오. 때마다, 새 목록의 마지막에 선택된 번호를 넣고 그 목록을 단축, 이전 목록의 복사본에서 제거합니다. 작업이 완료되면, 새로운 목록이 단행 숫자를 포함하고 이전 목록의 복사본이 비어 있습니다.

    다른 방법으로, 당신은 사용 수를 제거하여 목록의 사본을 단축 선택한 번호를 받아 즉시 사용할 수 있습니다. 당신이 목록에서 번호를 제거했기 때문에, 다시 올 수 없습니다.

  17. from https://stackoverflow.com/questions/18806210/generating-non-repeating-random-numbers-in-js by cc-by-sa and MIT license