임의의 값으로 배열 만들기


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.