Get a random number focused on center

后端 未结 20 2990
离开以前
离开以前 2020-12-12 09:28

Is it possible to get a random number between 1-100 and keep the results mainly within the 40-60 range? I mean, it will go out of that range rarely, but I want it to be main

相关标签:
20条回答
  • 2020-12-12 09:42

    Taking arrays of numbers, etc. isn't efficient. You should take a mapping which takes a random number between 0 to 100 and maps to the distribution you need. So in your case, you could take f(x)=-(1/25)x2+4x to get a distribution with the most values in the middle of your range.

    Distribution

    0 讨论(0)
  • 2020-12-12 09:43

    I needed to solve this problem a few years ago and my solution was easier than any of the other answers.

    I generated 3 randoms between the bounds and averaged them. This pulls the result towards the centre but leaves it completely possible to reach the extremities.

    0 讨论(0)
  • 2020-12-12 09:44

    This answer is really good. But I would like to post implementation instructions (I'm not into JavaScript, so I hope you will understand) for different situation.


    Assume you have ranges and weights for every range:

    ranges - [1, 20], [21, 40], [41, 60], [61, 100]
    weights - {1, 2, 100, 5}
    

    Initial Static Information, could be cached:

    1. Sum of all weights (108 in sample)
    2. Range selection boundaries. It basically this formula: Boundary[n] = Boundary[n - 1] + weigh[n - 1] and Boundary[0] = 0. Sample has Boundary = {0, 1, 3, 103, 108}

    Number generation:

    1. Generate random number N from range [0, Sum of all weights).
    2. for (i = 0; i < size(Boundary) && N > Boundary[i + 1]; ++i)
    3. Take ith range and generate random number in that range.

    Additional note for performance optimizations. Ranges don't have to be ordered neither ascending nor descending order, so for faster range look-up range that has highest weight should go first and one with lowest weight should go last.

    0 讨论(0)
  • 2020-12-12 09:45

    I might do something like setup a "chance" for the number to be allowed to go "out of bounds". In this example, a 20% chance the number will be 1-100, otherwise, 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>

    fiddle: http://jsfiddle.net/kbv39s9w/

    0 讨论(0)
  • 2020-12-12 09:50

    Ok, so I decided to add another answer because I felt like my last answer, as well as most answers here, use some sort of half-statistical way of obtaining a bell-curve type result return. The code I provide below works the same way as when you roll a dice. Therefore, it is hardest to get 1 or 99, but easiest to get 50.

    var loops = 10; //Number of numbers generated
    var min = 1,
        max = 50;
    var div = $("#results").html(random());
    
    function random() {
        var values = "";
        for (var i = 0; i < loops; i++) {
            var one = generate();
            var two = generate();
            var ans = one + two - 1;
            var num = values += ans + "<br/>";
        }
        return values;
    }
    
    function generate() {
        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>
    <div id="results"></div>

    0 讨论(0)
  • 2020-12-12 09:50

    If you can use the gaussian function, use it. This function returns normal number with average 0 and sigma 1.

    95% of this number are within average +/- 2*sigma. Your average = 50, and sigma = 5 so

    randomNumber = 50 + 5*gaussian()
    
    0 讨论(0)
提交回复
热议问题