随机数统计

时间:2013-09-06 15:33:42

标签: algorithm pseudocode

我想为一个角色创建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的统计数据,并且没有更多数字可以添加,这意味着前几个统计数据得分最多。我想我开始接受这种错误的方式。有任何想法吗?我认为我现在有隧道视野。

2 个答案:

答案 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()均匀分布,那应该会给出相当不错的结果。