[javascript] 중심에 초점을 맞춘 난수 얻기

1-100 사이의 난수를 얻고 결과를 주로 40-60 범위 내에서 유지할 수 있습니까? 내 말은, 그 범위를 거의 벗어나지 않지만 주로 그 범위 내에 있기를 원합니다 … JavaScript / jQuery로 가능합니까?

지금은 basic을 사용하고 Math.random() * 100 + 1있습니다.



답변

가장 간단한 방법은 0-50에서 두 개의 난수를 생성하고 함께 더하는 것입니다.

이것은 두 개의 주사위 바이어스를 7쪽으로 굴리는 것과 같은 방식으로 50쪽으로 바이어스 된 분포를 제공합니다.

사실, @Falco가 제안한대로 많은 수의 “주사위” 를 사용하면 종 곡선에 더 가까운 근사치를 만들 수 있습니다.

function weightedRandom(max, numDice) {
    var num = 0;
    for (var i = 0; i < numDice; i++) {
        num += Math.random() * (max/numDice);
    }
    return num;
}

가중 난수

JSFiddle : http://jsfiddle.net/797qhcza/1/


답변

여기에는 구체적인 해결책을 제시하는 좋은 답변이 있습니다. 일반적인 해결책을 설명하겠습니다. 문제는:

  • 0과 1 사이에 다소 균일하게 분포 된 난수 의 출처가 있습니다 .
  • 다른 분포를 따르는 일련의 난수를 생성하고 싶습니다.

이 문제에 대한 일반적인 해결책은 운동하는 것입니다 분위수 기능을 원하는 분포를 한 다음 균일 한 소스의 출력에 분위수 기능을 적용 할 수 있습니다.

Quantile 함수는 원하는 분포 함수적분역수 입니다 . 분포 함수는 곡선의 한 부분 아래에있는 영역이 무작위로 선택된 항목이 그 부분에있을 확률과 같은 함수입니다.

여기에 그렇게하는 방법에 대한 예가 나와 있습니다.

http://ericlippert.com/2012/02/21/generating-random-non-uniform-data/

코드는 C #에 있지만 원칙은 모든 언어에 적용됩니다. 솔루션을 JavaScript에 맞게 수정하는 것이 간단해야합니다.


답변

숫자 등을 취하는 것은 효율적이지 않습니다. 0에서 100 사이의 난수를 사용하고 필요한 분포에 매핑하는 매핑을 사용해야합니다. 따라서 귀하의 경우 범위 중간에 가장 많은 값을 갖는 분포를 얻을 수 있습니다 .f(x)=-(1/25)x2+4x

분포


답변

숫자가 “범위를 벗어남”으로 설정되도록 “기회”를 설정하는 것과 같은 것을 할 수 있습니다. 이 예에서 20 % 확률은 1-100, 그렇지 않으면 40-60입니다.

$(function () {
    $('button').click(function () {
        var outOfBoundsChance = .2;
        var num = 0;
        if (Math.random() <= outOfBoundsChance) {
            num = getRandomInt(1, 100);
        } else {
            num = getRandomInt(40, 60);
        }
        $('#out').text(num);
    });

    function getRandomInt(min, max) {
        return Math.floor(Math.random() * (max - min + 1)) + min;
    }
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

<button>Generate</button>
<div id="out"></div>

바이올린 : http://jsfiddle.net/kbv39s9w/


답변

몇 년 전에이 문제를 해결해야했고 솔루션이 다른 답변보다 쉽습니다.

나는 경계 사이에 3 개의 무작위를 생성하고 평균을 냈습니다. 이것은 결과를 중심으로 끌어 당겨 지지만 사지에 완전히 도달 할 수있게합니다.


답변

그것은 보이는 바보하지만 당신은 랜드를 두 번 사용할 수 있습니다 :

var choice = Math.random() * 3;
var result;

if (choice < 2){
    result = Math.random() * 20 + 40; //you have 2/3 chance to go there
}
else {
    result = Math.random() * 100 + 1;
}


답변

물론 가능합니다. 무작위로 1-100을 만드십시오. 숫자가 <30이면 40-60 범위에서 생성되지 않으면 1-100 범위의 숫자를 생성하십시오.


댓글 달기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다