【问题标题】:Pick random numbers until number is high enough [javascript]选择随机数,直到数字足够高 [javascript]
【发布时间】:2016-02-20 15:49:36
【问题描述】:

我正在构建一个探路者角色生成器,但努力获得足够高的统计数据。所以我想告诉它重新滚动,除非总修正值高于 10。

掷骰子 4 次,最高的三个掷骰相加得出一个统计数据。六个统计数据被提供到一个数组中以供使用。总修饰符的计算方法是将所有六个统计数据相加,减去 60,然后将该数字除以 2。所以我已经得到了这里显示的所有内容。

我假设我现在正在寻找一个 if/else 语句,如果 checkModifier()

编辑:产生相同六个统计数字的代码存在问题。我已经修好了。

function makeDie(sides) {
    var die = function () {
        return 1 + Math.random() * sides | 0;
 };

die.times = function (count) {
    var rolls = [];
    for(var i = 0 ; i < count ; i++) {
        rolls.push(this());
    }
    return rolls;
 };

 return die;
}

var rollStat = function () {
    var dieRolls = makeDie(5).times(4)
    for (a in dieRolls) {
        dieRolls[a] += 1;
    }
var sortedRolls = dieRolls.sort();
    var singleStat = 0;
        for (b = 1; b < sortedRolls.length; b++) {
            singleStat += sortedRolls[b];
        }
    return singleStat;
}

var sixStats = function () {
    var ss = [];
        for (var c = 0; c < 6; c++) {
            ss.push(rollStat());
        }
    return ss;
}

var stats = sixStats();
var stats = stats.sort(function (a, b) { 
    return a - b;
});

var checkModifier = function() {
    var total = 0;
        for (var d in stats) {
            total += stats[d];
}
return (total-60)/2;
};

【问题讨论】:

  • 尚未查看所有代码,但 stats 是一个始终具有相同值的数组,这是预期的行为吗?此外,在 rollStat 函数中,您在 var dieRolls = makeDie(5).times(4); 下有一个循环。什么都不做,这是为什么呢?
  • 如果您正在生成“随机”数字,其中最小可接受数字为 10,则只需添加 10。
  • @juvian 它为每个随机数加 1,这样我就得到了一个介于 2 和 6 之间的数字。现在我把它输入了,我意识到可能有更好的方法来做到这一点。至于数组:我已经简化了代码,只是意识到我删除了获取 6 个不同随机数的功能。
  • 我在下面编辑了我的解决方案以适应您的更改 - 如果您需要,请告诉我。

标签: javascript if-statement random while-loop


【解决方案1】:

Here's a fiddle 看到你的编辑后我会给出的解决方案。

var createStats = function () {
    var stats = sixStats();

    stats = stats.sort(function (a, b) { 
        return a - b;
    });

    var total = 0;
        for (var d in stats) {
            total += stats[d];
        }
    var totalModifier = (total-60)/2;
    if (totalModifier < 10) {
        return createStats();
    } else {
        return totalModifier; //of course, ultimately you will probably want to return stats, not the totalModifier, but this is here for debugging purposes.
    }

};

您可以将this fiddle 视为概念证明。

另一个可能更简洁的解决方案:

var genStats = function () {
    var stats = sixStats();

    stats = stats.sort(function (a, b) { 
        return a - b;
    });

    return stats;
};

var totalMod = function (stats) {
    var total = 0;
        for (var d in stats) {
            total += stats[d];
        }
    var totalModifier = (total-60)/2;
    return totalModifier;
};

var createStats = function (minMod) {
    var stats = genStats();
    if (totalMod(stats) < minMod) {
        return createStats(minMod);
    } else {
        return stats;
    }

};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-15
    • 2017-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多