-1

キャラクターの 7 つの統計を作成し、3 ~ 21 の値をランダムに生成し、統計の合計が 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 番目の統計にヒットしたときに追加する数字がない場合もあります。つまり、最初のいくつかの統計が最も多くのポイントを獲得します。そもそも間違った方法でこれに取り組んでいると思います。何か案は?私はこの時点でトンネル視力を持っていると思います。

4

2 に答える 2

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して、答えを切り上げます)、それぞれから等しい数を引きます。まれに、ステータスが 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 です。これは、構築パラメーターを使用した一般的なランダム セットから予想される値です。

于 2013-09-06T15:59:17.247 に答える
0

random(N)範囲内の数値を返す適切な関数を想定した、わずかに異なるアプローチの C 風の擬似コードを次に示します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()かなり良い結果が得られるはずです。

于 2013-09-06T20:43:12.313 に答える