4

プログラムは次のことを行うことになっています。

  1. 0に等しい値のグリッド「ActualGridValues」(X行×Y列)を初期化します。
  2. 別の値のグリッド「RandomGridValues」(X行×Y列)を作成し、グリッド内の各セルを-ZからZの範囲のN個の乱数の平均に等しいものとして定義します。
  3. RandomGridValuesの数値をActualGridValuesの対応するセルに追加します。
  4. ActualGridValuesのセルごとに、隣接するセルの値も追加されます。
  5. 手順2〜4を無限に繰り返します。

その結果、ランダムな構造がグリッド内で合体します。高い正の値のグループ化は近くのセルに影響を与え、それらを高く歪ませます。低い負の値のグループ化は同じことを行いますが、低く歪めます。

すべてのセルのすべての値の合計積はゼロである必要があります。高スキュー数と低スキュー数のローカライズされたグループがありますが、十分に大きいサンプルサイズでは、すべてのセルの合計はゼロである必要があります。

問題は、たとえば1000回の反復の後、値が一貫して負に歪むことです。構造があり、高点と低点がローカライズされていますが、合計値は常に負に偏っています。(これは、時間の経過とともにグリッド全体が負の数のみで満たされることを意味します)。

シミュレーションが実行されるたびに、値は負に偏ります。理由について何か考えはありますか?

編集:私は次の機能に問題を切り分けました。RandomGridValueのすべての数値の平均値は、ほとんどの場合負になります。

//For every cell value, this function generates a string of random numbers between -RandMax/2 and +RandMax/2. It then takes the average of all of these numbers. It assigns that value to a cell in the RandomGridValue array. 

function AddChaos() {
     for (var l = 0; l < GridX; l++) {
         for (var m = 0; m < GridY; m++) {
             var RandomGrid = 0;
             for (var n = 0; n < RandNums; n++) {
                 RandomGrid = RandomGrid + Math.random() * RandMax * 2 - RandMax;
             }
             RandomGridValue[l][m] = RandomGrid / RandNums;
         }
     }
 }  
4

1 に答える 1

2

Javascriptが実装する浮動小数点標準のため、10進値を使用して算術演算を行うことは、控えめに言ってもバグがあります...

回避策の1つは、100を掛けて小数を整数に変換し、計算を行ってから100で割ることです。

これは、小数点以下2桁までの場合にのみうまく機能します。それ以上の精度が必要な場合は、その部分にJavascript以外の言語をお勧めします。

于 2013-03-12T18:16:43.450 に答える