我想为一个角色创建7个统计数据,随机生成3-21的值,stat的总和不高于91.我已经尝试将统计数据排列成一个数组,然后像这样经历它们:
1) add random(15) to each array member
2) computing the total, subtracting from the 91 maximum
3) dividing this difference by 7
4) do step 1 with random(difference) adding it to the stat
5) Until I hit the 91 total.
这样做几百次我似乎得到了一条曲线,其中5,6和7的数据往往更高。有时我会达到4或5的统计数据,并且没有更多数字可以添加,这意味着前几个统计数据得分最多。我想我开始接受这种错误的方式。有任何想法吗?我认为我现在有隧道视野。
答案 0 :(得分:1)
听起来你正在思考这个问题。我可能会这样做:
const
STAT_QTY = 7;
STATSUM_MAX = 91;
STAT_MIN = 3;
STAT_MAX = 21;
type
TStatArray = Array [0..STAT_QTY-1] of integer;
然后在实施中:
function GenerateStats : TStatArray;
var statArr : TStatArray;
i, statSum, excess, debit : integer;
done : boolean;
begin
Randomize;
done := false;
while not done do begin
done := true;
statSum := 0;
for i := 0 to STAT_QTY - 1 do begin
statArr[i] := STAT_MIN + Random(STAT_MAX - STAT_MIN);
statSum := statSum + statArr[i];
end;
if statSum > STATSUM_MAX then begin
excess := statSum - STATSUM_MAX;
debit := excess div STAT_QTY + 1;
for i := 0 to STAT_QTY -1 do begin
statArr[i] := statArr[i] - debit;
end;
end;
for i := 0 to STAT_QTY -1 do begin
if statArr[i] < STAT_MIN then done := false;
end;
end;
result := statArr;
end;
这将生成3-21范围内的随机统计数据列表。如果总和大于91,则将超出除以统计数量(使用div
然后向上舍入答案)并从每个中减去相等的数字。在极少数情况下,您最终得到的统计数据少于三,只需再次执行。完成工作。
经过2000次迭代测试,我获得了平均值:
[1] : 11.13893053
[2] : 11.15692154
[3] : 11.16141929
[4] : 11.11444278
[5] : 11.10194903
[6] : 10.9800100
[7] : 10.86856572
这是一个总平均值为11.07,标准偏差为0.11 - 当然是关于你的建筑参数随机设置的预期值。
答案 1 :(得分:0)
这是C-ish伪代码,用于稍微不同的方法,假设一个合适的random(N)
函数返回0 - N-1
范围内的数字。
int stats[7], deficit = 70;
for (int i = 0; i < 7; ++i)
stats[i] = 3; // initial assignments of the minimum to each stat
while (deficit)
{ int tmp = random(7); // pick a random stat to bump
if (stats[tmp] == 21) // but not if it's already at max
continue;
++stats[tmp];
--deficit;
}
假设您的random()
均匀分布,那应该会给出相当不错的结果。