分配随机数,避免JavaScript中某个范围的阻塞数

时间:2019-05-04 08:53:23

标签: javascript arrays

我有一款游戏,如果用户从棋盘上选择一个特定的数字,便可以赢得额外的奖励。

游戏大师选择游戏的范围,额外的奖品将随机分配给一个数字。

但是,额外的奖品无法分配:

  • 更改为“阻止的号码”
  • 或与其他奖项相同的号码

我有一种粗略的方法来确保头奖不匹配。

如何将此代码扩展为涵盖所有5个额外奖项?我担心我是否仅将函数复制5次就可能永远循环?

最好在数组中创建游戏范围,然后在生成每个奖品时将其值删除?

var gameMinNum = 10;
var gameMaxNum = 125;
var gameBlockedNum = [5,12,66,97,124,129,165,200]

var extraPrizeNum1 = 0;
var extraPrizeNum2 = 0;
var extraPrizeNum3 = 0;
var extraPrizeNum4 = 0;
var extraPrizeNum5 = 0;


function randomGenerator(xUpper,xLower)
{
  return Math.floor(Math.random()*(xUpper-xLower+1)+xLower);
}

function PrizeNum1() {

  extraPrizeNum1 = randomGenerator(gameMaxNum,gameMinNum);
  if (gameBlockedNum.includes(extraPrizeNum1)) {
    PrizeNum1();
  } 
}

1 个答案:

答案 0 :(得分:3)

您可以为已使用的值输入Set,并为所有价格获取一个数组。

function randomGenerator(xUpper, xLower) {
    return function () {
        return Math.floor(Math.random() * (xUpper - xLower + 1) + xLower);
    };
}

function getExtraPrices(randomFn, length, blocked) {
    var selected = new Set(blocked);
    return Array.from({ length }, () => {
        var number;
        while (selected.has(number = randomFn())) ;
        selected.add(number);
        return number;
    });
}

var gameMinNum = 10,
    gameMaxNum = 125,
    gameBlockedNum = [5, 12, 66, 97, 124, 129, 165, 200],
    extraPricesCount = 5,
    random = randomGenerator(gameMaxNum, gameMinNum),
    extraPrices = getExtraPrices(random, extraPricesCount, gameBlockedNum);

console.log(extraPrices);