あなたはこれを考えすぎているようです。私はこのようなことをするかもしれません:
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
して、答えを切り上げます)、それぞれから等しい数を引きます。まれに、ステータスが 3 未満になった場合は、もう一度やり直してください。ジョブ完了。
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 です。これは、構築パラメーターを使用した一般的なランダム セットから予想される値です。