うーん、これは面白い。Barışがくれたリンクを見てみました。結局、「メソッドの複雑さ」に関係しているように思えますが、それをさらにテストする方法がわかりません。私はFlash CS5を使用しており、Flash Player 10、Actionscript 3(もちろん)用に公開しています。
オリジナル:
function overflow(stack:int = 0):void {
if(stack < 5290){
trace(stack);
overflow(stack + 1);
}
}
// gives 5287
ここで、1 つの Math.random() 呼び出しを overflow() メソッドに追加します。
function overflow(stack:int = 0):void {
Math.random();
if(stack < 5290){
trace(stack);
overflow(stack + 1);
}
}
// gives 4837
複数の Math.random() 呼び出しを追加しても違いはありません。また、ローカル変数に格納したり、overflow() メソッドに別のパラメーターを追加して、ランダムに生成された値を「運ぶ」こともできません。
function overflow(stack:int = 0):void {
Math.random();
Math.random();
if(stack < 5290){
trace(stack);
overflow(stack + 1);
}
}
// still gives 4837
この時点で、次のようなさまざまな Math 呼び出しを試しました。
// just the change to that 1 line:
Math.pow() // gives 4457
Math.random(), Math.sqrt(), Math.tan(), Math.log() // gives 4837
興味深いことに、Math クラスに何を渡すかは問題ではないようですが、一定のままです。
Math.sqrt(5) vs Math.sqrt(Math.random()) // gives 4837
Math.tan(5) vs Math.tan(Math.random()) // gives 4837
Math.pow(5, 7) vs Math.pow(Math.random(), Math.random()) // 4457
私がそれらのうちの3つを連鎖するまで:
Math.tan(Math.log(Math.random())); // gives 4457
その「グループ」からの 2 つの Math 呼び出しは、1 つの Math.pow() 呼び出しと「等しい」ように見えますか? =b Math.pow() と何か他のものを混ぜても、値は減少しないようです:
Math.pow(Math.random(), Math.random()); // gives 4457
ただし、2 つの Math.pow() をチェーンすると、次のようになります。
Math.pow(Math.pow(Math.random(), Math.random()), Math.random()); // 4133
私は何度も続けることができますが、いくつかのパターンがあるのだろうか:
Results: 5287, 4837, 4457, 4133
Differences: 450 380 324