数组中的随机100个数字增加1但不总和增加到100

时间:2014-01-06 10:27:10

标签: actionscript-3 actionscript

我的朋友在Facebook上发布了这个问题,我不知道它是怎么发生的。

考虑以下代码:

var num:Array = new Array();
var i:int, sum:int = 0;
for(i=0; i<100; i++) num[i] = 0;
for(i=0; i<100; i++) num[Math.floor(Math.random()*100)] += 1;
for(i=0; i<100; i++) sum += num[i];
trace(sum);

它总和应为100,但每次运行时会打印不同的数字,有时sum会大于100.(即使sum的类型为Number或{{ 1}},*更改为其他一些数字,例如1;结果不接近0.1 - 某些不是,如10.0 }。)

同时,这些代码工作正常。

9.9999993

var num:Array = new Array();
var i:int, sum:int = 0;
for(i=0; i<100; i++) num[i] = 0;
for(i=0; i<100; i++) num[Math.floor(Math.random()*100)]++;
for(i=0; i<100; i++) sum += num[i];
trace(sum);

所有时间都正确打印100个。

另外,JavaScript中的这段代码可以正常工作

var num:Array = new Array();
var i:int, sum:int = 0;
for(i=0; i<100; i++) num[i] = 0;
for(i=0; i<100; i++){
    var tmp:Number = Math.floor(Math.random()*100);
    num[tmp] += 1;
}
for(i=0; i<100; i++) sum += num[i];
trace(sum);

虽然var num = new Array(); var i, sum = 0; for(i=0; i<100; i++) num[i] = 0; for(i=0; i<100; i++) num[Math.floor(Math.random()*100)] += 1; for(i=0; i<100; i++) sum += num[i]; console.log(sum); 刚刚更改为console.log并且作为AS2或AS3代码运行时不是。是什么导致了这种行为?

(使用了Adobe Flash CS6,似乎无论哪个Flash Player被定位(安装版本是12.0.0.38)以及是否使用AS2或AS3;甚至“AIR 3.2 for Desktop”的行为也相同。)

1 个答案:

答案 0 :(得分:-1)

Facebook上的其他人刚评论了我朋友的帖子:

function foo():int {
    trace("foo()");
    return 0;
}
var arr:Array = new Array();
trace("bar");
arr[foo()] = 0;
trace("bar");
arr[foo()] += 10;

打印

bar
foo()
bar
foo()
foo()

,表明在评估a += b时,a会被评估两次。