【问题标题】:Random 100 numbers in an array are increased by 1 but not sum to 100数组中的随机 100 个数字加 1 但总和不为 100
【发布时间】:2014-01-23 17:39:19
【问题描述】:

我的朋友在 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 也是相同的更改为其他一些数字,例如 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);

和

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);

all 始终正确打印 100。

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

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 更改为trace 并作为AS2 或AS3 代码运行时,情况并非如此。是什么导致了这种行为?

(使用的是 Adob​​e Flash CS6,似乎针对哪个 Flash Player(安装的版本为 12.0.0.38)以及使用的是 AS2 还是 AS3 都无关紧要;甚至“AIR 3.2 for Desktop”的行为都一样。)

【问题讨论】:

  • Facebook 上的其他人刚刚找到原因; a[x] += b 被编译为 a[x] = a[x] + b 和...

标签: actionscript-3 actionscript


【解决方案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被求值两次。

【讨论】:

    猜你喜欢
    • 2014-01-19
    • 1970-01-01
    • 1970-01-01
    • 2011-11-09
    • 1970-01-01
    • 2011-12-25
    • 2014-01-16
    • 1970-01-01
    相关资源
    最近更新 更多