Random integer in a certain range excluding one number

后端 未结 7 2288
广开言路
广开言路 2020-12-03 17:49

I would like get a random number in a range excluding one number (e.g. from 1 to 1000 exclude 577). I searched for a solution, but never solved my issue.

I want some

相关标签:
7条回答
  • 2020-12-03 18:41

    As @ebyrob suggested, you can create a function that makes a mapping from a smaller set to the larger set with excluded values by adding 1 for each value that it is larger than or equal to:

    // min - integer
    // max - integer
    // exclusions - array of integers
    //            - must contain unique integers between min & max
    function RandomNumber(min, max, exclusions) {
        // As @Fabian pointed out, sorting is necessary 
        // We use concat to avoid mutating the original array
        // See: http://stackoverflow.com/questions/9592740/how-can-you-sort-an-array-without-mutating-the-original-array
        var exclusionsSorted = exclusions.concat().sort(function(a, b) {
            return a - b
        });
    
        var logicalMax = max - exclusionsSorted.length;
        var randomNumber = Math.floor(Math.random() * (logicalMax - min + 1)) + min;
    
        for(var i = 0; i < exclusionsSorted.length; i++) {
            if (randomNumber >= exclusionsSorted[i]) {
                randomNumber++;
            }
        }
    
        return randomNumber;
    }
    

    Example Fiddle

    Also, I think @JesusCuesta's answer provides a simpler mapping and is better.

    Update: My original answer had many issues with it.

    0 讨论(0)
提交回复
热议问题