임의의 값으로 배열 만들기


100

0부터 39까지의 임의 값을 사용하여 40 개의 요소로 배열을 어떻게 만들 수 있습니까? 처럼

[4, 23, 7, 39, 19, 0, 9, 14, ...]

여기에서 솔루션을 사용해 보았습니다.

http://freewebdesigntutorials.com/javaScriptTutorials/jsArrayObject/randomizeArrayElements.htm

그러나 내가 얻는 배열은 거의 무작위 화되지 않습니다. 연속적인 숫자 블록을 많이 생성합니다.

답변:


53

다음은 고유 번호 목록을 섞는 솔루션입니다 (반복 없음).

for (var a=[],i=0;i<40;++i) a[i]=i;

// http://stackoverflow.com/questions/962802#962890
function shuffle(array) {
  var tmp, current, top = array.length;
  if(top) while(--top) {
    current = Math.floor(Math.random() * (top + 1));
    tmp = array[current];
    array[current] = array[top];
    array[top] = tmp;
  }
  return array;
}

a = shuffle(a);

반복 된 값 (OP가 원하는 것이 아님)을 허용하려면 다른 곳을 찾으십시오. :)


4
이 솔루션은 숫자가 고유해야하는 경우 유용하지만 완전히 다른 통계 / 확률 적 문제입니다. 나는 이것이 OP에 명확하고 그들의 경우와 관련이 없었기를 바랍니다. 그러나 어떤 경우에는 프로그램의 정확성에 큰 영향을 미칠 수 있습니다. (나는 대답을 비판하는 것이 아니라 미래의 독자들을 위해 깃발을 올리는 것뿐입니다. 당신은 그것을 언급하고 싶을 것입니다.) 또한보십시오 : en.wikipedia.org/wiki/Combination ( "with"또는 "without repetition"사이의 구별
chiccodoro

var random_array = new Array (40) .fill (). map ((a, i) => a = i) .sort (() => Math.random ()-0.5); 위와 동일하다고 생각합니다
Jamie337nichols 19

숫자 0 생성에서 제외하는 방법은 무엇입니까?
Gosi

208

최단 접근법 (ES6)

// randomly generated N = 40 length array 0 <= A[N] <= 39
Array.from({length: 40}, () => Math.floor(Math.random() * 40));

즐겨!


당신이 옳습니다. 내 댓글을 삭제했습니다. 실제 최단 방법 수정 : [... Array (20)]. map (() => {return Math.floor (Math.random () * 30)});
jaheraho

7
답변의 접근 방식에서 공백을 제거하면 제안한 것보다 4 자 더 적습니다. 물론 골프에 관심이 있다면 실제로 몇 가지 쉬운 문자 자르기 단축키를 생략했습니다. [...Array(40)].map(_=>Math.ceil(Math.random()*40));당신의 것보다 11 자 적고 원본보다 7 자 적습니다.
Kyle Baker

(수정할만큼 빠르지 않았습니다.를 사용하는 경우 OP의 기준을 충족하려면 * 39가되어야 Math.ceil하지만 옵션으로 0을 잘라 냈습니다. 0-39 대신 1-40을 허용 할 수 있으면 작동합니다. 그렇지 않으면 다시로가는 대한 개선의 문자를 줄이기 Math.floor)
카일 베이커에게

우수 !!! 공유해 주셔서 감사합니다
Adriel Werlich

43

ES5 :

function randomArray(length, max) {
    return Array.apply(null, Array(length)).map(function() {
        return Math.round(Math.random() * max);
    });
}

ES6 :

randomArray = (length, max) => [...new Array(length)]
    .map(() => Math.round(Math.random() * max));

1
무엇이야 _i인수? 내가 착각하지 않는 한 ES6에서는 불필요합니다.
AfricanMatt

2
@AfricanMatt _는 현재 요소이며 i현재 인덱스입니다. 당신 말이 맞습니다. 두 경우 모두 불필요합니다. 원하는 경우 제거 할 수 있습니다.
Eugene Kulabuhov

1
ES6 용 버전이 어디서 작동한다고 생각하는지 모르겠습니다. Array.from works ... 여기에 코드 예제가 있습니다 ... randomArray = (length : number, max : number) => Array.from ({length}) .map (() => Math.floor (Math .random () * 최대));
Christian Matthew

31

더 짧은 ES6 접근 방식 :

Array(40).fill().map(() => Math.round(Math.random() * 40))

또한 인수가있는 함수를 가질 수 있습니다.

const randomArray = (length, max) => 
  Array(length).fill().map(() => Math.round(Math.random() * max))

1
.fill는 () 값 매개 변수가 필요합니다
데미안 초록색

4
@DamianGreen- .fill()매개 변수없이 배열을으로 채 웁니다. undefined이것은 여기서 .map()작동하는 데 필요한 유일한 것입니다
vsync

@Damjan 숫자를 반복하지 않는 방법이 있습니까? 이 접근 방식을 좋아했습니다
Henrique

변수를 사용하는 @Henrique? 🤔
Sebj

@Sebj가 가능합니까? 내 말은, 이와 같이 짧고 소품을 길이와 최대 값으로 사용하는 모든 접근 방식은 나에게 완벽하게 작동합니다. :)
Henrique


16

Math.random()0과 1 (배타적) 사이의 숫자를 반환합니다. 따라서 0-40을 원하면 40으로 곱할 수 있습니다. 가장 높은 결과는 곱한 값입니다.

var arr = [];
for (var i=0, t=40; i<t; i++) {
    arr.push(Math.round(Math.random() * t))
}
document.write(arr);

http://jsfiddle.net/robert/tUW89/


1
명확히하기 위해 "l = 40", "i <l"및 "Math.random () * l"에서 숫자 1이 아니라 문자 L입니다. 글꼴은 말하기 어렵습니다.
Mu Mind

11

.. 내가 얻는 배열은 거의 무작위 화되지 않습니다. 연속적인 숫자 블록을 많이 생성합니다.

무작위 항목의 시퀀스는 종종 연속적인 숫자 블록을 포함합니다 . Gambler 's Fallacy를 참조하십시오 . 예를 들면 :

.. 우리는 4 개의 앞면을 연속으로 던졌습니다. .. 5 번 연속 앞면이 나올 확률이 1⁄32에 불과하기 때문에 도박꾼의 오류에 노출 된 사람은 다음 번에 앞면이 앞면이 될 가능성이 적다고 생각할 수 있습니다. 꼬리입니다. http://en.wikipedia.org/wiki/Gamblers_fallacy


정확히 +1. 실제 (통계적으로) 난수가 필요한지 아니면 "무작위로 보이는"숫자가 필요한지 결정해야합니다.
chiccodoro 2014-08-25

4

숫자의 범위가 제한되어 있기 때문에 가장 좋은 방법은 배열을 생성하고 0부터 39까지의 숫자로 채운 다음 섞는 것입니다.


여기 이 기술의 시각화 (해당 페이지는 사용하지만 끔찍한 셔플 알고리즘 ).
Phrogz 2011

나는 그가 사이에있는 모든 숫자를 원한다는 것을 모르지만 오히려 완전히 무작위입니까? 무작위 순서, 정적 값으로 괜찮다면 괜찮을 것입니다.
Robert

작업을 수행 할 수 있지만 Math.random()각 번호가 한 번 나타나고 반복되지 않기 때문에 40 번 사용한 경우와 약간 다른 결과를 제공 합니다.
Mu Mind

4
let randomNumber = Array.from({length: 6}, () => Math.floor(Math.random() * 39));

쉽게 볼 수 있도록 배열을 6 개의 값으로 제한했습니다.


3
var myArray = [];
var arrayMax = 40;
var limit = arrayMax + 1;
for (var i = 0; i < arrayMax; i++) {
  myArray.push(Math.floor(Math.random()*limit));
}

위의 방법은 전통적인 방법이지만 값 비싼 계산을하지 않고 배열에서 중복을 피하려면 @Pointy와 @Phrogz를 두 번째로 사용합니다.


3

일상적인 단선 솔루션.

배열의 값은 총 랜덤이므로이 스 니펫을 사용하면 달라집니다.

소문자로 된 임의의 문자가있는 배열 (길이 10)

Array.apply(null, Array(10)).map(function() { return String.fromCharCode(Math.floor(Math.random() * (123 - 97) + 97)); })

[ 'k', 'a', 'x', 'y', 'n', 'w', 'm', 'q', 'b', 'j']

0에서 99 사이의 임의의 정수가있는 배열 (길이 10)

Array.apply(null, Array(10)).map(function() { return Math.floor(Math.random() * 100 % 100); })

[86, 77, 83, 27, 79, 96, 67, 75, 52, 21]

배열 임의 날짜 (10 년 전부터 지금까지)

Array.apply(null, Array(10)).map(function() { return new Date((new Date()).getFullYear() - Math.floor(Math.random() * 10), Math.floor(Math.random() * 12), Math.floor(Math.random() * 29) )})

[2008-08-22T21 : 00 : 00.000Z, 2007-07-17T21 : 00 : 00.000Z,
2015-05-05T21 : 00 : 00.000Z, 2011-06-14T21 : 00 : 00.000Z,
2009-07-23T21 : 00 : 00.000Z, 2009-11-13T22 : 00 : 00.000Z,
2010-05-09T21 : 00 : 00.000Z, 2008-01-05T22 : 00 : 00.000Z,
2016-05-06T21 : 00 : 00.000Z, 2014-08-06T21 : 00 : 00.000Z]

배열 (길이 10) 임의의 문자열

Array.apply(null, Array(10)).map(function() { return Array.apply(null, Array(Math.floor(Math.random() * 10  + 3))).map(function() { return String.fromCharCode(Math.floor(Math.random() * (123 - 97) + 97)); }).join('') });

[ 'cubjjhaph', 'bmwy', 'alhobd', 'ceud', 'tnyullyn', 'vpkdflarhnf', 'hvg', 'arazuln', 'jzz', 'cyx']

여기에서 찾을 수있는 다른 유용한 정보 https://github.com/setivolkylany/nodejs-utils/blob/master/utils/faker.js


1

몇 가지 새로운 ES6 기능을 사용하면 이제 다음을 사용하여이 작업을 수행 할 수 있습니다.

function getRandomInt(min, max) {
    "use strict";
    if (max < min) {
        // Swap min and max
        [min, max] = [min, max];
    }

    // Generate random number n, where min <= n <= max
    let range = max - min + 1;
    return Math.floor(Math.random() * range) + min;
}

let values = Array.from({length: 40}, () => getRandomInt(0, 40));

console.log(values);

이 솔루션은 화살표 함수 및 Array.from ()과 같은 ES6 기능을 지원하는 최신 브라우저에서만 작동합니다.


1

아래를 참조하십시오 :-

let arr = Array.apply(null, {length: 1000}).map(Function.call, Math.random)
/* will create array with 1000 elements */

0

@Phrogz가 제안한 페이지에서

for (var i=0,nums=[];i<49;i++) nums[i]={ n:i, rand:Math.random() };
nums.sort( function(a,b){ a=a.rand; b=b.rand; return a<b?-1:a>b?1:0 } );

0

이 솔루션이 제공 한 것과 약간 다른 것이 필요했습니다. 지정된 범위에있는 여러 개의 고유 한 난수로 배열을 만들어야한다는 점입니다. 아래는 내 솔루션입니다.

function getDistinctRandomIntForArray(array, range){
   var n = Math.floor((Math.random() * range));
   if(array.indexOf(n) == -1){        
    return n; 
   } else {
    return getDistinctRandomIntForArray(array, range); 
   }
}

function generateArrayOfRandomInts(count, range) {
   var array = []; 
   for (i=0; i<count; ++i){
    array[i] = getDistinctRandomIntForArray(array, range);
   };
   return array; 
}

불필요한 호출이 많이 발생할 가능성이있는 루프를 만들지 않기를 원했지만 (카운트와 범위가 높고 동일한 수에 가까운 경우) 이것이 제가 생각 해낼 수있는 최선의 방법입니다.


0
function shuffle(maxElements) {
    //create ordered array : 0,1,2,3..maxElements
    for (var temArr = [], i = 0; i < maxElements; i++) {
        temArr[i] = i;
    }

    for (var finalArr = [maxElements], i = 0; i < maxElements; i++) {
        //remove rundom element form the temArr and push it into finalArrr
        finalArr[i] = temArr.splice(Math.floor(Math.random() * (maxElements - i)), 1)[0];
    }

    return finalArr
}

이 방법은 난수 생성기에 의해서만 제한되는 확률 문제를 해결할 것이라고 생각합니다.


0

0 ... 길이 범위에서 임의의 고유 값이 필요한 경우 :

const randomRange = length => {
  const results = []
  const possibleValues = Array.from({ length }, (value, i) => i)

  for (let i = 0; i < length; i += 1) {
    const possibleValuesRange = length - (length - possibleValues.length)
    const randomNumber = Math.floor(Math.random() * possibleValuesRange)
    const normalizedRandomNumber = randomNumber !== possibleValuesRange ? randomNumber : possibleValuesRange

    const [nextNumber] = possibleValues.splice(normalizedRandomNumber, 1)

    results.push(nextNumber)
  }

  return results
}

randomRange(5) // [3, 0, 1, 4, 2]

0

나는 이것이 반복없이 무작위 배열을 만드는 가장 짧은 방법이라고 확신합니다.

var random_array = new Array(40).fill().map((a, i) => a = i).sort(() => Math.random() - 0.5);

"꽤 확실합니다", keys함수 를 사용하는 것은 Array.from(Array(40).keys()).sort(_ => Math.random() - .5)어떻습니까 : ? 미쳐 버릴 수도 있고 스프레드 연산자를 사용할 수도 있습니다! 하지만 지금 당장은 너무 흥분됩니다.
Yeti

0

파티에 조금 늦었지만 나는 randojs.com 을 무작위로 사용 합니다. 다음과 같이 0부터 39까지 무작위로 섞인 숫자 배열을 얻을 수 있습니다.

console.log(randoSequence(40));
<script src="https://randojs.com/1.0.0.js"></script>

그것의 모든 물류에 소란스럽지 않고 읽기 쉽고 이해하기 쉽습니다. :)


0

발전기

반복되는 값없이 임의의 가능한 값 40 개 (0-39)로 구성된 길이 40의 배열은 @Phrogz 및 @Jared Beck이 설명하는대로 셔플하는 것이 좋습니다. 기록을위한 또 다른 접근 방식은 생성기를 사용하는 것입니다. 그러나이 접근 방식은 다른 제안 된 솔루션에 비해 성능이 부족합니다 .

function* generateRandomIterable(n, range) {
  for (let i = 0; i < n; i++) {
    yield ~~(Math.random() * range);
  }
}
const randomArr = [...generateRandomIterable(40,40)];
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.