JavaScript会生成除某些值之外的随机数

时间:2014-12-10 16:45:15

标签: javascript

我通过调用generateRandom()生成1到20的随机数。如何排除某些值,例如8和15?

function generateRandom(min, max) {
    return Math.floor(Math.random() * (max - min + 1)) + min;
}

var test = generateRandom(1, 20)

14 个答案:

答案 0 :(得分:9)

应该是而不是

function generateRandom(min, max) {
    var num = Math.floor(Math.random() * (max - min + 1)) + min;
    return (num === 8 || num === 15) ? generateRandom(min, max) : num;
}

var test = generateRandom(1, 20)

答案 1 :(得分:6)

维持生成器统计属性的一种方法是在[1,18]中生成一个数字。然后按此顺序申请:

  1. 如果数字是8或更多,请加1。

  2. 如果数字为15或更多,请加1。

  3. 我不愿拒绝和重新采样,因为这会导致相关平原出现在线性同余生成器中。

答案 2 :(得分:4)

现在我正在使用它并且它可以在不引起浏览器无限循环问题的情况下工作,也可以在移动设备中测试(使用Ionic / Cordova):

function getRandomIndex(usedIndexs, maxIndex) {
    var result = 0;
    var min = 0;
    var max = maxIndex - 1;
    var index = Math.floor(Math.random()*(max-min+1)+min);

    while(usedIndexs.indexOf(index) > -1) {
        if (index < max) {
            index++;
        } else {
          index = 0;
        }
    }

    return index;
}

答案 3 :(得分:2)

    /**
    * Returns a random integer between min (inclusive) and max (inclusive).
    * Pass all values as an array, as 3rd argument which values shouldn't be generated by the function.
    * The value is no lower than min (or the next integer greater than min
    * if min isn't an integer) and no greater than max (or the next integer
    * lower than max if max isn't an integer).
    * Using Math.round() will give you a non-uniform distribution!
    */
    
function getRandomInt(min, max) {
   const minimum = Math.ceil(min);
   const maximum = Math.floor(max);

   return Math.floor(Math.random() * (maximum - minimum + 1)) + minimum;
}


function getRandomIntExcludingExistingNumbers(min, max, excludeArrayNumbers) {
  let randomNumber;

  if(!Array.isArray(excludeArrayNumbers)) {
    randomNumber = getRandomInt(min, max);
    return randomNumber;
  }

  do {
    randomNumber = getRandomInt(min, max);
  } while ((excludeArrayNumbers || []).includes(randomNumber));

  return randomNumber;
}

const randomNumber = getRandomIntExducingExistingNumbers(1, 10, [1, 2, 4, 5, 9]);

// 将返回 1 到 10 之间的随机整数,不包括 1,2,4,5,9

说明:

getRandomInt 函数生成最小值和最大值之间的随机数。

我正在利用该函数制作“getRandomIntExclusionExistingNumbers”函数以避免特定值。

我们将简单地调用 getRandomInt(min, max) 值。 然后在 do while 循环中,我们将检查随机生成的值是否属于任何不应生成的值。

如果它是唯一的整数排除值之外,那么我们将返回该值。

如果我们的值来自排除的值,那么从 do --while 循环中,我们将再次调用 getRandomInt 以生成新值。

答案 4 :(得分:0)

您可以使用递归函数

function generateRandom(min, max, num1, num2) {
    var rtn = Math.floor(Math.random() * (max - min + 1)) + min;
    return rtn == num1 || rtn == num2 ? generateRandom(min, max, num1, num2) : rtn;
}

答案 5 :(得分:0)

我认为应该是这样的,如果你想在所有数字上做好分配。 并且,对于该解决方案,需要更高的最大值15和更低的最小值8

function generateRandom(min, max) {
    var v =  Math.floor(Math.random() * (max - min + 1 - 2)) + min;
    if (v == 8) return max-1;
    else if (v == 15) return max-2;
    else return v;
}

var test = generateRandom(1, 20)

答案 6 :(得分:0)

您可以动态构建数组。取决于您获取排除数字的位置。类似的东西:

var excluded = [8, 15];
var random = [];
for(var i = min; i <= max; i++) {
  if(excluded.indexOf(i) !== -1) {
    random.push(i);
  }
}

然后使用此帖子的答案中提供的提示:How can I generate a random number within a range but exclude some?。应该带你到你想去的地方。

答案 7 :(得分:0)

这是一个非常愚蠢的过于复杂的解决方案......

        <script>
    var excludedNumbers = [];
    excludedNumbers.push(8);
    excludedNumbers.push(15);
    excludedNumbers.push(10);

    var array = generateExclude(excludedNumbers, 1, 20);

    function generateExclude(excludedNumbers, min, max){
        var newNumbers = [];
        for(var i = min; i <= max; i++) {
            for(var j = 0; j < excludedNumbers.length; j++) {
                var checker = $.inArray(i, excludedNumbers)
                if(checker > -1){

                }else{
                    if($.inArray(i, newNumbers)<= -1){
                        newNumbers.push(i); 
                    }

                }
            };
        };
        return newNumbers;
    }
    function generateRandomNumbers(items){
        var num = items[Math.floor(Math.random()*items.length)];;
        return num;
    }
    console.log(generateRandomNumbers(array))
    </script>

答案 8 :(得分:0)

我已经回答了类似的Java问题:Generate random numbers except certain values。我只是按照以下方式复制并粘贴答案。

  

实际上,我们不需要将var area = Microsoft.Maps.WellKnownText.read(x, { polygonOptions: { strokeColor: stroke, strokeThickness: 10 }}); 与while循环一起使用。

     

为了简化问题,让我们看看如果我们只有一个排除值会发生什么。我们可以将结果拆分为contains(random)部分。然后可能的值的数量是2。如果随机数小于排除值,则返回它。否则,我们可以添加range-1

     

对于多个排除值,我们可以将结果集拆分为1部分,其中size+1表示排除值的数量。然后可能的值的数量是size。然后我们按升序排序值排序。如果随机数小于排除值减去range-size,那么我们只返回随机数add i,其中i是排除值的索引。

i

答案 9 :(得分:0)

这是一个稍微修改过的答案,类似于所有其他答案,但它允许您传递一个或一组失败的数字

function generateRandom(min, max, failOn) {
    failOn = Array.isArray(failOn) ? failOn : [failOn]
    var num = Math.floor(Math.random() * (max - min + 1)) + min;
    return failOn.includes(num) ? generateRandom(min, max, failOn) : num;
}

答案 10 :(得分:0)

我已经阅读了所有这些答案,他们在哲学方面有很大的不同,所以我想我可能会添加我自己的2位,尽管这个问题有答案,因为我认为有更好的和更优雅的方式解决这个问题。

我们可以创建一个以min,max和blacklist为参数的函数,并在不使用递归的情况下输出随机结果(并且if语句接近0):

const blrand = function(min, max, blacklist) { if(!blacklist) blacklist = [] let rand = (min, max) => Math.floor(Math.random() * (max - min + 1)) + min; let retv = 0; while(blacklist.indexOf(retv = rand(min,max)) > -1) { } return retv; }

用法: let randomNumber = blrand(0, 20, [8, 15]);

答案 11 :(得分:0)

您可以简单地这样做

function generatedRandExclude(showed,max) {
     let randNo = -1;
     while(showed.length < max) {
        	randNo = Math.floor(Math.random() * Math.floor(max));	
         	if(!showed.includes(randNo)) {
            	showed.push(randNo);
             	break;
          }
     }
     return randNo;
}

let showed = [];
function run() {
    console.log(generatedRandExclude(showed,6));
}
run();
run();
run();
run();

generatedRandExclude生成使用数组showed排除的随机数。

答案 12 :(得分:0)

这是一个简单整洁的想法,我是一名机电工程师,我只是在学习JS。 这将打印一个介于1到100之间的随机数字。 除了8和15

 var r;   // this is the random integer.
 var val; //this will serve as validator for the random integer.

 val=0; 
 while(val==0)    {
 r=Math.round(Math.random()*100)+1;
 if(r!=8 && r!=15){val=1;}    //a valid number will be any number different from 8 and 15
                              //then validator will change and go out from the loop.
                }   
document.write(r);

答案 13 :(得分:0)

您可以对大于或等于零的随机值进行偏移,并使用排序(升序)数组,然后返回调整后的随机值之和。

const
    getRandomWithoutZero = (lower, upper, gaps) => () => {
        const r = Math.floor(Math.random() * (upper - lower + 1 - gaps.length) + lower);
        return gaps.reduce((s, g) => s + (s >= g), r);
    },
    random = getRandomWithoutZero(-9, 9, [-3, 0, 4]),
    count = {};

for (let i = 0; i < 1.6e6; i++) {
    const r = random();
    count[r] = (count[r] || 0) + 1;
}

console.log(count);
.as-console-wrapper { max-height: 100% !important; top: 0; }